我有两个批处理文件,用于运行大型C ++构建,第一个启动进程,创建目录并确定要发送到第二个脚本的内容。如果向第一个脚本显示某些信息,我会弹出一个窗口并要求输入密码。通过调用第二个脚本将其传递给第二个脚本
call script2.bat -pw:myPassword
myPassword是用户输入的内容。现在,我一直在测试这个脚本,我的一个用户密码包含一个分号,所以我们得到了这个
call script2.bat -pw:my;Password
通过引用引号我发现我可以将其放入第二个脚本中
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个批处理文件:
一只蝙蝠:
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%
...返回以下结果:
参数:-pw:“my; Password” 开关:-pw 价值:我的;密码
试着逃避;用^。
call script2.bat "-pw:my^;Password"
尝试将脚本放在双引号中......分号是一个命令分隔符,以便您可以在一行上键入多个命令。 DOS的旧时代,以及DOSKEY,您可以通过按Ctrl + T来分离命令,现在命令行处理器中的分号。不要担心引号,因为命令处理器仍然可以解析它,使用双引号的原因是绕过长文件名/路径约定。
call "script2.bat -pw:\"my;Password\""
我创建了一个批处理“函数”,它可以“正确”解析参数并正确处理等号和分号。我想你会发现它可以帮助你解决这些问题。在我的网站上可以找到完整的详细信息和示例:http://skypher.com/index.php/2010/08/17/batch-command-line-arguments/
代替
for /F "tokens=1,2 delims=:" %%a in ( "%1" ) DO SET switch=%%a&value=%%b
使用
for /F "tokens=1,2 delims=:" %%a in ( "%~1" ) DO SET switch="%%~a" & SET value="%%~b"
或者(最好是我的思维方式)
for /F "tokens=1,2 delims=:" %%a in ( "%~1" ) DO (
SET switch="%%~a"
SET value="%%~b"
)
检查HELP CALL和HELP FOR以了解有关报价删除的%〜语法。