我有两个批处理文件,用于运行大型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
我最终需要的是包含我的密码;密码以便我可以将其传递给另一个程序
有关如何正确解析
的任何想法这里是重新发布问题的批处理文件:
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%
答案 0 :(得分:3)
我发现了一个小技巧来解决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”
开关:-pw
VALUE:我的;密码
答案 1 :(得分:3)
尝试逃避;用^。
call script2.bat "-pw:my^;Password"
答案 2 :(得分:0)
尝试将脚本放在双引号中...分号是一个命令分隔符,以便您可以在一行上键入多个命令。 DOS的旧时代,以及DOSKEY,您可以通过按Ctrl + T来分离命令,现在命令行处理器中的分号。不要担心引号,因为命令处理器仍然可以解析它,使用双引号的原因是绕过长文件名/路径约定。
call "script2.bat -pw:\"my;Password\""
答案 3 :(得分:0)
我创建了一个批处理“函数”,它可以“正确”解析参数并正确处理等号和分号。我想你会发现它可以帮助你解决这些问题。我的网站上提供了完整的详细信息和示例:http://skypher.com/index.php/2010/08/17/batch-command-line-arguments/
答案 4 :(得分:0)
代替
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"
)
检查“帮助呼叫”和“帮助”以了解%〜语法以删除引号。