windows - 对带有特殊符号的文件进行 CALL 失败

标签 windows batch-file cmd parameter-passing method-call

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

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

:test
echo %1

通常这工作正常,但如果文件夹中有文件%~aaa.txt,则表示批参数替换中路径运算符的以下用法无效: %~aaa.txt.

如何让它正确处理这个问题?也许有些无法逃脱?

最佳答案

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

  1. 首先,%%d 扩展为当前迭代的文件,在失败情况下为 %~aaa.txt
  2. 由于 call 命令,表达式 %~aaa.txt 现在会再次解析,其中 %~ 是一个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避免例行公事。

关于windows - 对带有特殊符号的文件进行 CALL 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68371682/

相关文章:

variables - 如何在批处理文件中使用空格传递命令行参数

java - 从 cmd 运行代码时出现错误 : package org. apache.log4j 不存在

node.js - 文件资源管理器如何打开文件?

.net - 如何控制 .NET 服务引用的文件名?

C++/Windows 多线程同步/数据共享

java - 设置 Maven 的问题

mysql - 用于在 Windows 中打开 mysql 控制台的简单 .bat 文件?

batch-file - 替换 FOR 循环中的子字符串

windows - 在 Windows 中,如何删除一个文本文件中存在于另一个文本文件中的所有行?

windows - 使用 mysqldump 时如何将备份文件重定向到另一个文件夹/驱动器?