我有一个批处理脚本,需要对其每个参数执行一个操作。每个参数都是一个文件名(没有开关),当然文件名可以包含空格。批处理脚本可以通过将文件拖到资源管理器中的 .bat 图标中或通过在命令行输入文件并将参数用引号括起来来运行。
在批处理脚本中,处理带空格的参数存在问题。如果我按如下方式使用 %*
,引号将被忽略,空格之间的每个“单词”都被视为一个参数。
for %%x in (%*) do (
echo %%x
)
我也尝试过使用 shift
,它似乎也不能正常工作,在名称中包含空格的文件上窒息:
:next
if not %1 == "" (
echo %1
shift /1
goto next
)
遍历所有参数的理想方法是什么?
在 Bash 中,人们可以简单地使用 "$@"
和一切 Just Works™,但当然 Windows 批处理脚本似乎并非如此。
最佳答案
for 变量引用的替换修饰符也允许使用 ~ 扩展。参见 for command reference .
通过使用 "%%~x"
,您应该得到一个正确引用的参数,类似于 bash 处理 "$@"
的方式。
@echo off
setlocal enableextensions
for %%x in (%*) do (
echo "%%~x"
)
字符 , 和 ;可用于分隔命令参数。参见 command shell overview .因此,您必须在包含这些字符的文件名周围加上引号。
如果您将文件从 Explorer 拖到 .bat 上,如果文件的路径中有空格字符,Explorer 只会正确引用该文件。例如,D:\a,b,c.exe
不会被 Explorer 引用,因此会被 cmd.exe 解析为三个单独的参数。
要使脚本在这些异常情况下从资源管理器中拖放,您可以使用以下(丑陋的)解决方法:
@echo off
setlocal enableextensions enabledelayedexpansion
set "args=%*"
set "args=%args:,=:comma:%"
set "args=%args:;=:semicolon:%"
for %%x in (%args%) do (
set "filepath=%%~x"
set "filepath=!filepath::comma:=,!"
set "filepath=!filepath::semicolon:=;!"
echo "!filepath!"
)
该脚本引入了一个辅助变量 args
,其中每次出现的麻烦字符都被替换为占位符(请注意,冒号本身不能用于 Windows 下的文件名中)。
for 循环的主体使用另一个辅助变量 filepath
来撤消转换以生成原始路径。
关于cmd - 批处理脚本参数中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3416457/