在批处理文件中使用SetDelayedExpansion:处理包含!的目录/文件名

3

我有两个批处理文件(XP):

test.bat:

setlocal EnableDelayedExpansion

rem check for argument
if [%1]==[] goto :noarg

:arg
rem check for trailing backslash and remove it if it's there
set dirname=%1
IF !dirname:~-1!==\ SET "dirname=!dirname:~0,-1!"

rem find all log files in passed directory and call test2.bat for each one
for /f "tokens=* delims= " %%a in ('dir !dirname!\*.log /s /b') do call test2.bat "%%a"

goto :finish

:noarg
rem prompt for directory to scan
set /p dirname=Type the drive or directory, then hit enter: 

rem loop if nothing entered
if [!dirname!]==[] goto :noarg

rem check for trailing backslash and remove it if it's there
IF !dirname:~-1!==\ SET "dirname=!dirname:~0,-1!"

rem find all log files in passed directory and call test2.bat for each one
for /f "tokens=* delims= " %%a in ('dir "!dirname!"\*.log /s /b') do call test2.bat "%%a"

goto :finish

:finish

test2.bat:

echo %1

展示问题:
-创建名为c:\test和c:\test!的目录,并在每个目录中放置一个空的test.log文件。
然后运行:
test c:\test

这个测试按预期工作(test2.bat会输出"c:\test\test.log")

现在运行:

test c:\test!

问题在于test2.bat回显了"c:\test\test.log"而不是期望的"c:\test!\test.log"。
我意识到这是因为!被保留用于EnableDelayedExpansion。但如果解决方案是"使用%扩展",那么我就陷入困境了,因为我需要使用DelayedExpansion(根据处理批处理文件中带有空格的尾随反斜杠和目录名)。
我已经进行了以下尝试:
setlocal DisableDelayedExpansion

并且

endlocal

我无法成功地(可能是用户操作问题)转义cmd脚本中的感叹号!。

有什么想法吗?

链接:如何在cmd脚本中转义感叹号!?

1个回答

2
问题在于%1和%%a的扩展,通过延迟扩展,!被移除。
所以你应该先禁用延迟扩展。
顺便说一下,去掉末尾的斜杠不是必要的(编辑:仅当它不是根路径时才是真的)。
setlocal DisableDelayedExpansion

rem check for argument
if "%~1"=="" goto :noarg

:arg
set "dirname=%~1"

rem find all log files in passed directory and call test2.bat for each one
for /f "tokens=* delims=" %%a in ('dir "%dirname%\*.log" /s /b') do (
  set "file=%%~a"
  setlocal EnableDelayedExpansion
  echo found #!file!#
  call test2.bat "!file!"
  endlocal
)

再次感谢@jeb!就在我认为我已经理解了某些东西的时候...您能否解释一下为什么我不需要删除尾随反斜杠?例如,我正在处理用户传递c:\ - 这会使for /F行由于:"c:\*.log"而出现错误。 - Craig H
@Craig H:您是正确的,它不能在根目录下工作,但可以在任何其他目录下,例如c:\temp\*.log(我只测试了第二种情况)。 - jeb
感谢澄清 - 只是想看看我是否忽略了什么。再次感谢您的帮助! - Craig H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接