gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:52:19 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com