在 Windows 脚本中读取命令行参数时,有没有办法转义逗号字符?

Posted

技术标签:

【中文标题】在 Windows 脚本中读取命令行参数时,有没有办法转义逗号字符?【英文标题】:When reading command line arguments in Windows script, is there a way to escape the comma character? 【发布时间】:2015-07-03 00:42:29 【问题描述】:

我正在尝试从命令行读取多个输入参数。最后一个应该是逗号分隔的列表,但脚本只能读取逗号之前的第一个单词。

也就是说,当我调用脚本时:test.cmd a b c d,e,f%4d,而我希望它被读取为 d,e,f

我已经查阅了很多资料来解决这个问题,但似乎 Windows 中的命令行参数无法被操纵(标记化等)并且按原样传递给脚本。这是真的?从命令行读取输入时有没有办法逃避 , ?

【问题讨论】:

【参考方案1】:

引用您的论点,然后使用%~1%~2 等检索它们。如果您使用test.cmd a b c "d,e,f"%~4 将包含d,e,f

编辑:这是我在下面的第二条评论中描述的解决方法:

@echo off
setlocal

echo 1: %~1
echo 2: %~2
echo 3: %~3

:loop
if not "%~4"=="" (
    if defined four ( set "four=%four%,%~4" ) else set "four=%~4"
    shift /4
    goto loop
)

echo 4: %four%

示例会话:

【讨论】:

哦,是的,谢谢!如果不改变用户传递参数的方式就不可能做到这一点吗? 没有。 Windows 对空格、逗号、分号的参数进行标记,我不确定还有哪些其他字符。 test.cmd a b c d,e,f 有 6 个参数。我想你可以一起加入%~4%~5%~6 作为一种解决方法。如果 csv 列表中有未知数量的字段,或者它的字段可能比%~1%~9 读取的字段多,您可能需要循环和shift,附加一个变量在每次迭代中,直到 %~4 为空。更容易期望用户引用论点,真的。 @SugandhaBanga 如果我的回答有帮助,请考虑将其标记为已接受。 See this page 解释为什么这很重要。 毫无疑问,引用参数似乎是在所有情况下实现 OP 目标的最佳实践 @Rojo 完成。非常感谢。这很有帮助。【参考方案2】:

下面的方法允许你用逗号分隔任意数量的参数:

@echo off
setlocal EnableDelayedExpansion

rem Get command line arguments
set "args=%*"
set n=0
for %%a in ("%args: =" "%") do (
   set /A n+=1
   set "arg[!n!]=%%~a"
)

echo Argument 4: %arg[4]%

rem Show all arguments given
echo/
for /L %%i in (1,1,%n%) do echo %%i- !arg[%%i]!

输出示例:

C:\> test.bat a b c d,e,f o,p,q,r x,y,z
Argument 4: d,e,f

1- a
2- b
3- c
4- d,e,f
5- o,p,q,r
6- x,y,z

【讨论】:

以上是关于在 Windows 脚本中读取命令行参数时,有没有办法转义逗号字符?的主要内容,如果未能解决你的问题,请参考以下文章

处理用户输入

如何在 Windows 命令行中使用参数运行 Python 脚本

Perl 不接收命令行参数?

[Asp.Net Core] 命令行参数读取+配置多种读取

[Asp.Net Core] 命令行参数读取+配置多种读取

启用以在不使用 CLI 的情况下运行的 Python 脚本不采用命令行参数