我有两个用于运行大型 C++ 构建的批处理文件,第一个启动进程,创建目录并确定要发送给第二个脚本的内容。如果某些信息被提供给第一个脚本,我有一个弹出窗口并要求输入密码的例程。通过像这样调用第二个脚本将其传递给第二个脚本
call script2.bat -pw:myPassword
其中 myPassword 是用户输入的内容。 现在,我一直在测试这个脚本,我的一个用户密码包含一个分号,所以我们得到了这个
call script2.bat -pw:my;Password
我发现通过加引号我可以把它放到第二个脚本中 OK
call script2.bat -pw:"my;Password"
但是,当我尝试这样做时,命令行解析中断
for /F "tokens=1,2 delims=:" %%a in ( "%1" ) DO SET switch=%%a&value=%%b
如果我 echo %1
它显示如下
-pw:"my;Password"
但是当脚本运行时回显我看到了
for /F "tokens=1,2 delims=:" %%a in ( "-pw:"my Password"" ) DO SET switch=%%a&value=%%b
它解析为 switch=-pw
和 value="my
我最终需要的是让值包含我的密码,这样我就可以将它传递给另一个程序
关于如何让它正确解析的任何想法
这里有 2 个解决问题的批处理文件:
a.bat:
echo on
call b.bat -pw:eatme
call b.bat -pw:eat;me
call b.bat -pw:"eat;me"
call "b.bat -pw:\"eat;me\""
b.bat:
echo on
echo %1
for /F "tokens=1,2 delims=: " %%a in ( "%1" ) DO SET switch=%%a&SET value=%%b
echo switch=%switch%
echo value=%value%
最佳答案
我发现了一个绕过 shell 在 FOR/F 循环中解释“%1”值的方式的小技巧:不是解析字符串,而是解析命令 ECHO %1< 的输出
,像这样:
FOR /F "tokens=1,2 delims=:" %%a IN ( 'ECHO %1' ) DO ECHO Switch: %%a Value: %%b
如果您在命令行中将密码放在引号中(call script2.bat -pw="my;password"
),这会起作用,因此我们必须按如下方式删除引号:
SET VALUE=%VALUE:~1,-1%
所以这是我想出的代码:
ECHO OFF
ECHO Arguments: %1
FOR /F "tokens=1,2 delims=:" %%a IN ( 'ECHO %1' ) DO (
SET SWITCH=%%a
SET VALUE=%%b
)
ECHO SWITCH: %SWITCH%
SET VALUE=%VALUE:~1,-1%
ECHO VALUE: %VALUE%
...返回以下结果:
Arugments: -pw:"my;Password"
SWITCH: -pw
VALUE: my;Password
关于windows - 在命令行上处理分号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2477554/