微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调用带有特殊符号的文件失败

如何解决调用带有特殊符号的文件失败

我试图对文件夹中的每个文件进行一些操作。

for %%d in (*.txt) do call:test "%%d"
pause
exit /B

:test
echo %1

通常这可以正常工作,但如果文件夹中有文件 %~aaa.txt,它会显示 The following usage of the path operator in batch-parameter substitution is invalid: %~aaa.txt

如何使其正确处理?也许有些无法逃避?

解决方法

问题是 call 命令第二次解析命令行 call:test "%%d"(应该读为 call :test "%%~d"):

  1. 起初,%%d 扩展为当前迭代的文件,在失败情况下为 %~aaa.txt
  2. 由于 %~aaa.txt 命令,表达式 call 现在再次解析,其中 %~argument reference 的开头,下面的 a 是修饰符(~a 将扩展为文件属性),但缺少十进制数字(例如,%~a1%~aaa2 是有效的)。

要解决这个问题,您可以将参数放入一个普通的环境变量中并在子例程中读取它(我在其中使用了 delayed variable expansion 以避免出现特殊字符的麻烦):

for %%d in (*.txt) do (
    set "ARG=%%~d"
    call :test
)
exit /B

:test
setlocal EnableDelayedExpansion
echo(!ARG!
endlocal
exit /B

您也可以将变量名称作为参数传递给子例程:

for %%d in (*.txt) do (
    set "ARG=%%~d"
    call :test ARG
)
exit /B

:test
setlocal EnableDelayedExpansion
echo(!%~1!
endlocal
exit /B

另一种方法是让 call 在第二个解析阶段扩展实际文件名:

for %%d in (*.txt) do (
    set "ARG=%%~d"
    call :test "%%ARG%%"
)
exit /B

:test
set "STR=%~1"
setlocal EnableDelayedExpansion
echo(!STR!
endlocal
exit /B

为了避免文件名包含 ^& 或其他特殊字符的问题,子例程中避免使用简单的 echo(%~1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。