在 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
%4
是 d
,而我希望它被读取为 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 脚本中读取命令行参数时,有没有办法转义逗号字符?的主要内容,如果未能解决你的问题,请参考以下文章