windows - 在命令行上处理分号

标签 windows batch-file cmd

我有两个用于运行大型 C++ 构建的批处理文件,第一个启动进程,创建目录并确定要发送给第二个脚本的内容。如果某些信息被提供给第一个脚本,我有一个弹出窗口并要求输入密码的例程。通过像这样调用第二个脚本将其传递给第二个脚本

call script2.bat -pw:myPassword

其中 myPassword 是用户输入的内容。 现在,我一直在测试这个脚本,我的一个用户密码包含一个分号,所以我们得到了这个

call script2.bat -pw:my;Password

我发现通过加引号我可以把它放到第二个脚本中 OK

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 个解决问题的批处理文件:

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%

最佳答案

我发现了一个绕过 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"
SWITCH: -pw
VALUE: my;Password

关于windows - 在命令行上处理分号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2477554/

相关文章:

c++ - 在 C++ 中定义 Unicode 时映射格式说明符?

windows - 如何从 PowerShell 获取错误代码 (ErrorLevel) 到 Windows 命令提示符?

c++ - 调用远程设置 EAX 和 ECX 的函数

Octopus 中的 Powershell 执行

windows - 传递多行字符串

c# - 如何使用参数打开外部 Java 控制台应用程序、捕获输出并在其上执行命令?

windows - 如何在 windows 2012 服务器中终止特定任务

运行 HelloWorld.java 时未找到 java.exe

c++ - 如果您在进程崩溃后为其分配内存会怎样?

windows - 如何使用 Delphi 播放单音或自定义波形?