cmd - 批处理脚本参数中的空格

标签 cmd batch-file

我有一个批处理脚本,需要对其每个参数执行一个操作。每个参数都是一个文件名(没有开关),当然文件名可以包含空格。批处理脚本可以通过将文件拖到资源管理器中的 .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/

相关文章:

linux - 如何在 linux 服务器上安排 .sh 脚本?

windows - 批处理文件: Extract characters from the end of a string in a loop

python - 脚本在 CMD 中运行时因 AttributeError 而失败,但在 IDLE 中执行正常

batch-file - 批处理文件包含变量的外部文件

windows - 从批处理文件中安全删除 USB?

batch-file - 由于某种未知原因,变量未插入另一个变量 : Converting text to binary

windows - 批量连接字符串和变量

maven - EOF异常: Input contained no data in cmd

batch-file - 删除批处理变量中的非字母数字字符

python - 在 Windows 中使用批处理文件静默安装 numpy.exe