如何比较批处理文件中的文件名

时间:2012-02-19 13:13:50

标签: batch-file compare

有两个文件名:0_1_en.pdf和GEN 0 GENERAL.html。如果变量%% H中的html文件符合规则“GEN 0 * .pdf”,则最后四行代码是我尝试(不成功)进行比较。对不起我的英文,我不知道如何更好地说,但我尝试比较规则是否给出了有效的文件名。因此,如果有文件名“GEN 0 GENERAL.html”,它应该显示字符串GEN 0 GENERAL.html。如果这不符合规则,则不会打印任何字符串。因此,如果我读取文件名“GEN 3 SERVICES.html”,那么将不打印任何内容。

@echo off
SETLOCAL EnableDelayedExpansion
for /f "delims=" %%P in ('dir /b *.pdf') do (
SET "sPDFName=%%~nxP"
echo "!sPDFName:~0,1!"
IF "!sPDFName:~0,1!"=="1" (SET "sPDFName=!sPDFName:~0,1!")
IF "!sPDFName:~0,1!"=="0" (SET "sPDFName=!sPDFName:~0,1!")
SET tempStr="GEN !sPDFName!*.html"
echo !tempStr!
::echo "!sPDFName!"
for /f "delims=" %%H in ('dir /b *.html') do (
CALL SET substring=%%H:~!tempStr!%%
echo K:%substring%
IF "%%substring%%"=="%%H" (echo %%H) ELSE (echo NOT FOUND)
pause ))

给出结果: “0” “GEN 0 * .pdf” K: 未找到 按任意键继续......

1 个答案:

答案 0 :(得分:1)

我认为代码失败的主要原因是CALL SET substring=%%H:~!tempStr!%%行没有任何意义。我不确定你在那里尝试了什么,但我很确定它没有给出你想要的结果。

尝试1(不太正确)
我相信我理解你的目标是什么,我认为你的代码比它需要的要复杂得多。

我认为您要测试每个pdf文件以查看是否存在“GEN n GENERAL.html”文件,其中“n”与pdf文件名中的第一个字符匹配。

看看这是否给出了您正在寻找的结果

@echo off
setlocal enableDelayedExansion
for %%F in (*.pdf) do (
  set "pdfFile=%%F"
  set "htmlFile=GEN !pdfFile:~0,1! GENERAL.html"
  if exist "!htmlFile!" (set result=FOUND) else (set result=NOT FOUND)
  echo testing "!pdfFile!": "!htmlFile!" !result!
)

尝试2(OP评论后)
我再次查看了你的CALL SET语句,看起来你正在尝试对FOR变量进行子串操作

  • 问题1:您无法在FOR变量扩展
  • 上执行子字符串或搜索和替换
  • 问题2:!tempStr!不包含子字符串操作的正确语法

我仍然不明白你对CALL代码的期望是什么,所以我不知道如何修复它。

但是你的评论有助于我理解你的总体目标是什么:对于名字= n的第一个字符的pdf,你正在寻找“GEN n * .html”。

如果您需要做的就是打印出匹配的html文件,或者如果没有找到则打印出错误信息,那么这应该有效:

@echo off
setlocal enableDelayedExansion
for %%P in (*.pdf) do (
  set "pdfFile=%%P"
  set htmlMask="GEN !pdfFile:~0,1!*.html"
  echo(
  echo Testing "!pdfFile!": Looking for !htmlMask!
  dir /b !htmlMask!
)

如果您需要对每个找到的html文件执行某些操作,那么这应该有效:

@echo off
setlocal enableDelayedExansion
for %%P in (*.pdf) do (
  set "pdfFile=%%P"
  set htmlMask="GEN !pdfFile:~0,1!*.html"
  echo(
  echo Testing "!pdfFile!": Looking for !htmlMask!
  set "found="
  for %%H in (!htmlMask!) do (
    set found=1
    echo "%%H"
    REM do whatever you need to do with the %%P pdf file and %%H html file
  )
  if not defined found echo NOT FOUND
)

如果您只想处理以0或1开头的pdf文件,请更改第一个FOR语句,如下所示:

for %%P in (0*.pdf 1*.pdf) do (