在命令行上处理分号

时间:2010-03-19 13:20:01

标签: windows batch-file cmd

我有两个批处理文件,用于运行大型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=-pwvalue="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%

5 个答案:

答案 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"
)

检查“帮助呼叫”和“帮助”以了解%〜语法以删除引号。