Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 在命令行上处理分号 我有两个批处理文件,用于运行一个大的C++构建,第一个文件启动进程,创建目录并计算发送给第二个脚本的内容。如果在第一个脚本中显示了某些信息,我有一个例程,它会弹出一个窗口并要求输入密码。通过像这样调用第二个脚本,将其传递给第二个脚本 call script2.bat -pw:myPassword_Windows_Batch File_Cmd - Fatal编程技术网

Windows 在命令行上处理分号 我有两个批处理文件,用于运行一个大的C++构建,第一个文件启动进程,创建目录并计算发送给第二个脚本的内容。如果在第一个脚本中显示了某些信息,我有一个例程,它会弹出一个窗口并要求输入密码。通过像这样调用第二个脚本,将其传递给第二个脚本 call script2.bat -pw: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

其中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"
但是当脚本运行时,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"
)