批量通配符奇怪的行为

Batch wildcard strange behavior

我有一个文件列表,我正在遍历这些文件,这些文件与特定大小的字母 (A、B、C、D) 匹配。文件的形式是###T#####A###_# rev 1.dxf,其中rev 1只是偶尔出现,A指的是大小,也就是A, B、C 或 D。当我尝试在一组 D.dxf 或 B.dxf 中循环遍历这些文件时,一些 A 文件也是成立。我目前使用模式 ??????????A*.dxf,但想将其扩展到更多文件类型,而不必制作多个批处理文件。有趣的是,如果我使用模式 TA*.dxf,通配符会正常运行。

为什么会发生这种情况,我该如何解决它,同时仍然捕获 A 可能位于开头、结尾、中间等位置的文件?如果您需要任何说明或额外信息,请随时询问。

这是我的相关代码:

FOR %%S IN (A,B,C,D) DO (
echo Converting size %%S. . .
FOR %%F in ("%filepath%\?????????%%S*.dxf") DO (
    echo Converting %%~nxF to PDF, size %%S
    SET %%S=!%%S! "%%~pF%%~nF.pdf"
    "C:\Program Files\AutoDWG\AutoDWG DWG to PDF Converter\d2p.exe"  /InFile %%~fF /OutFile %%~nF.pdf /Watermark %~dp0%%Swatermark.wdf /InConfigFile %~dp0%%S.ddp
)
echo:
echo Combining %%Ss. . .
pdftk !%%S! cat output "%filepath%\print\%%Ss.pdf"
echo Combined
echo:
)

编辑:我在 32 位 Windows XP 上 运行。跟这个有关系吗this thread?我回家再调查

编辑 2:我现在知道问题出在哪里了。当我有几个具有相同开头字符的文件时,8.3 短名称包含一个十六进制数,它可能与我要搜索的字母之一匹配。如何在我的 for 循环中放弃短名称匹配?

您的 link 到 Strange Windows DIR command behavior thread seems to be a good thought. From RBerteig's thorough answer命令提示符处的通配符与长文件名和短“8.3”名称(如果存在)匹配。 ..。尝试下一种方法:

SETLOCAL enableextensions enabledelayedexpansion
:::
pushd %filepath%
FOR %%F in ("*.dxf") DO (
  set "fname=%%~nF"
  set "fmatch="
  set "char04=!fname:~3,1!"
  set "char10=!fname:~9,1!"
  if /I "!char04!"=="T" (
    FOR %%S in (A B C D) do if /I "!char10!"=="%%S" set "fmatch=!fname!"
  )
  if defined fmatch (
     echo Converting %%~nxF to PDF, size !char10!
     rem another stuff here
  )
)
popd