批量通配符奇怪的行为
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
我有一个文件列表,我正在遍历这些文件,这些文件与特定大小的字母 (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