在命令行上处理分号

问题描述 投票:2回答:5

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

我最终需要的是包含我的密码值;所以我可以将它传递给另一个程序

关于如何正确解析它的任何想法

这里是重新编写问题的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%
windows batch-file cmd
5个回答
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%

...返回以下结果:

参数:-pw:“my; Password” 开关:-pw 价值:我的;密码


3
投票

试着逃避;用^。

call script2.bat "-pw:my^;Password"

0
投票

尝试将脚本放在双引号中......分号是一个命令分隔符,以便您可以在一行上键入多个命令。 DOS的旧时代,以及DOSKEY,您可以通过按Ctrl + T来分离命令,现在命令行处理器中的分号。不要担心引号,因为命令处理器仍然可以解析它,使用双引号的原因是绕过长文件名/路径约定。

call "script2.bat -pw:\"my;Password\""

0
投票

我创建了一个批处理“函数”,它可以“正确”解析参数并正确处理等号和分号。我想你会发现它可以帮助你解决这些问题。在我的网站上可以找到完整的详细信息和示例:http://skypher.com/index.php/2010/08/17/batch-command-line-arguments/


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

检查HELP CALL和HELP FOR以了解有关报价删除的%〜语法。

© www.soinside.com 2019 - 2024. All rights reserved.