在命令行处理分号

我有两个batch file用于运行大型的c + +版本,第一个启动进程,创build目录并确定要发送到第二个脚本的内容。 如果某些信息显示给第一个脚本,我会有一个例程popup一个窗口并要求input密码。 通过调用第二个脚本来传递给第二个脚本

call script2.bat -pw:myPassword 

myPassword是用户input的内容。 现在,我一直在testing这个脚本,我的一个用户密码包含一个分号,所以我们得到了这个

 call script2.bat -pw:my;Password 

我发现通过join引号,我可以得到这个到第二个脚本确定调用script2.bat -pw:“我的密码”

但是,当我尝试这样做时,命令行parsing会中断

 for /F "tokens=1,2 delims=:" %%a in ( "%1" ) DO SET switch=%%a&value=%%b 

如果我回显%1,则显示如下

 -pw:"my;Password" 

但是,当脚本运行的时候,我会看到回声

 for /F "tokens=1,2 delims=:" %%a in ( "-pw:"my Password"" ) DO SET switch=%%a&value=%%b 

它parsing为开关= -pw和值=“我的

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

任何想法如何得到这个parsing正确

这里重新发布2个batch file:a.bat:echo on

打电话给b.bat -pw:eatme叫b.bat -pw:吃;我叫b.bat -pw:“吃;我”叫“b.bat -pw:\”吃;我\“”

b.bat:回声

回声%1

for / F“tokens = 1,2 delims =:”%% a in(“%1”)DO SET switch = %% a&SET value = %% b

回声开关=%开关%回声值=%值%

谢谢 ! 乔

我找到了一个小窍门来解决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" ),这将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:“我的密码”
开关:-pw
VALUE:my;密码

尝试逃避; 与一个^。

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

尝试把脚本放在双引号中…分号是一个命令分隔符,以便您可以在一行中键入多个命令。 DOS和DOSKEY的旧时代,你可以通过点击Ctrl + T(现在是命令行处理器中的分号)分隔出命令。 不要担心引号,因为命令处理器仍然可以解析引号,所以使用双引号的原因是解决长文件名/路径约定。

调用“script2.bat -pw:\”我的密码\“”

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