Windows 在命令行上处理分号 我有两个批处理文件,用于运行一个大的C++构建,第一个文件启动进程,创建目录并计算发送给第二个脚本的内容。如果在第一个脚本中显示了某些信息,我有一个例程,它会弹出一个窗口并要求输入密码。通过像这样调用第二个脚本,将其传递给第二个脚本 call script2.bat -pw:myPassword
其中myPassword是用户输入的内容。 现在,我一直在测试这个脚本,我的一个用户的密码包含一个分号,所以我们得到了这个Windows 在命令行上处理分号 我有两个批处理文件,用于运行一个大的C++构建,第一个文件启动进程,创建目录并计算发送给第二个脚本的内容。如果在第一个脚本中显示了某些信息,我有一个例程,它会弹出一个窗口并要求输入密码。通过像这样调用第二个脚本,将其传递给第二个脚本 call script2.bat -pw:myPassword,windows,batch-file,cmd,Windows,Batch File,Cmd,其中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
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"
但是当脚本运行时,echo打开,我看到
for /F "tokens=1,2 delims=:" %%a in ( "-pw:"my Password"" ) DO SET switch=%%a&value=%%b
它解析为switch=-pw
和value=“my
我最终需要的是让值包含我的;密码,这样我就可以将它传递给另一个程序
有没有关于如何正确解析的想法
这里有两个批处理文件,它们会引发问题:
a、 蝙蝠:
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、 蝙蝠:
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%
尝试将脚本用双引号括起来……分号是一个命令分隔符,因此您可以在一行中键入多个命令。在DOS的旧时代,使用DOSKEY,您可以通过按Ctrl+T来分隔命令,Ctrl+T现在是当今命令行处理器中的分号。不要担心引号作为命令处理器仍然能够解析它,使用双引号的原因是为了避开长文件名/路径约定 call "script2.bat -pw:\"my;Password\"" 调用“script2.bat-pw:\”我的;密码“”
我发现了一个小技巧,可以绕过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
值:我的;密码
试着用^来逃避这个问题
call script2.bat "-pw:my^;Password"
我已经创建了一个批处理“函数”,它可以对参数进行“正确”解析,并正确处理等号和分号。我想你会发现它可以帮助你解决这些问题。详细信息和示例可以在我的网站上找到:而不是
for /F "tokens=1,2 delims=:" %%a in ( "%1" ) DO SET switch=%%a&value=%%b
使用
或者(按照我的想法,最好是这样)
查看HELP CALL和HELP FOR以了解删除引号的语法。您是否尝试过在命令行中使用单引号或在密码周围使用单引号?我尝试了单引号,如在c>b.bat-pw:'eat;me'-更糟糕的是,它变成了%1=-pw:'eat和%2=me'我一定不明白什么,我想我确实把co用双引号-pw:“我的;密码“当它到达FOR语句时,hgover它显示为“-pm:“我的密码”,分号消失了。它似乎与“FOR”语句有关,因为在do echo%1中,紧靠“FOR”之前,它显示为-pw:“我的;密码“。在整个命令行(调用除外)周围加引号会导致错误“文件名、目录名或卷标签语法不正确”。这里有两个批处理文件出现问题。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%Close,我在结尾处有一个额外的“H:\My Documents\test>a H:\My Documents\test>echo on H:\My Documents\test>echo on H:\My Documents\test>call b.bat-pw:“eat;me”H:\My Documents\test>ECHO OFF参数:-pw:“eat;me”开关:-pw值:eat;我“您确定
设置值=%VALUE:~1,-1%
的语法正确吗?”?这将删除第一个和最后一个字符,不管它们是什么…我不知道发生了什么。它总是只删除第一个字符。。。也许在末端有一些不可见的空间?我会调查的。是的,是尾随空格。。。谢谢你的帮助!如果在这里包含答案的基本部分,并提供链接供参考,这将是一个更好的答案。如果链接页面发生更改,只有链接的答案可能会无效。这正是我所需要的。用插入符号转义分号导致cmd正确处理我的输入,至少在我的情况下是这样。
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"
)