Batch file 当存储在变量中时,如何正确转义plus%PROGRAMFILES(X86)%plus管道的多行输出plus

Batch file 当存储在变量中时,如何正确转义plus%PROGRAMFILES(X86)%plus管道的多行输出plus,batch-file,cmd,Batch File,Cmd,这在cmd中工作: "C:\Program Files (x86)\CodeMeter\Runtime\bin\cmu32.exe" --list-content | FIND "Serial Number 12345-" 输出(从多行中正确提取): 序列号为12345-67890、版本为1.19的CmContainer(锁定) 但我想让它在.bat文件中工作,并将结果存储到变量(从): 它抛出: 文件名、目录名或卷标语法不正确 PS:在最终版本中,我希望使用系统变量作为路径,如%PROGR

这在cmd中工作:

 "C:\Program Files (x86)\CodeMeter\Runtime\bin\cmu32.exe" --list-content | FIND "Serial Number 12345-"
输出(从多行中正确提取):

序列号为12345-67890、版本为1.19的CmContainer(锁定)

但我想让它在.bat文件中工作,并将结果存储到变量(从):

它抛出:

文件名、目录名或卷标语法不正确

PS:在最终版本中,我希望使用系统变量作为路径,如
%PROGRAMFILES(X86)%\CodeMeter\Runtime\bin\cmu32.exe“
,但尽管这在cmd中没有区别,但它会抛出“'C:\Program'不被识别为内部或外部命令、可操作程序或批处理文件。”。。。因此,我猜在您的命令行中存在转义问题:

对于(`“C:\Program^ Files^(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列表内容^查找“序列号12345-”`)中的/f“usebackq”%%i,请设置foobar=%i
后面表达式的第一个和最后一个引号被视为一对删除的引号;剩余部分将被处理,然后被识别为错误语法

为了防止这种情况,在周围放置另一对退出标记,但要避开它们,如下所示:

对于(`^“C:\Program Files(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列表内容中的/f“usebackq”%%i^查找“序列号12345-”^`)do SET foobar=%%i

出现这种奇怪行为的原因是,
for/F
使用
cmd/S/c
中运行
后面的命令行,因此这就是使用您的代码执行的内容(无任何转义):

cmd/S/c“c:\Program Files(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列出内容|查找“序列号12345--”
cmd/S
去掉第一行和最后一行
,并留下以下无效语法行:

C:\ProgramFiles(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列出内容|查找“序列号12345-
现在为了避免这种奇怪的余数,给
cmd
一些明确的引号来删除:

cmd/S/c“c:\Program Files(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列出内容|查找“序列号12345-”
我建议的转义是为了使命令路径(包括
)出现在一对引号之间,以便不必关心任何进一步的转义(如
^)
):

cmd/S/c^“c:\ProgramFiles(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列出内容|查找“序列号12345-”^”

您不需要使用
usebackq
选项,但可能需要
delims=
不在空白处拆分接收的字符串,如下所示:

for/f“delims=“%%i in(^”“%ProgramFiles(x86)%\CodeMeter\Runtime\bin\cmu32.exe”--列出内容^^查找“序列号12345-”^')是否设置“foobar=%%i”
在命令行中:

对于(`“C:\Program^ Files^(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列表内容^查找“序列号12345-”`)中的/f“usebackq”%%i,请设置foobar=%i
后面表达式的第一个和最后一个引号被视为一对删除的引号;剩余的引号随后被处理,然后被识别为错误语法

为了防止这种情况,在周围放置另一对退出标记,但要避开它们,如下所示:

对于(`^“C:\Program Files(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列表内容中的/f“usebackq”%%i^查找“序列号12345-”^`)do SET foobar=%%i

出现这种奇怪行为的原因是,
for/F
使用
cmd/S/c
中运行
后面的命令行,因此这就是使用您的代码执行的内容(无任何转义):

cmd/S/c“c:\Program Files(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列出内容|查找“序列号12345--”
cmd/S
去掉第一行和最后一行
,并留下以下无效语法行:

C:\ProgramFiles(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列出内容|查找“序列号12345-
现在为了避免这种奇怪的余数,给
cmd
一些明确的引号来删除:

cmd/S/c“c:\Program Files(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列出内容|查找“序列号12345-”
我建议的转义是为了使命令路径(包括
)出现在一对引号之间,以便不必关心任何进一步的转义(如
^)
):

cmd/S/c^“c:\ProgramFiles(x86)\CodeMeter\Runtime\bin\cmu32.exe”--列出内容|查找“序列号12345-”^”

您不需要使用
usebackq
选项,但可能需要
delims=
不在空白处拆分接收的字符串,如下所示:

for/f“delims=“%%i in(^”“%ProgramFiles(x86)%\CodeMeter\Runtime\bin\cmu32.exe”--列出内容^^查找“序列号12345-”^')是否设置“foobar=%%i”

通常不需要转义除
|
之外的任何内容,因为路径位于保护特殊字符的
之间;然而,在这种情况下,第一个
和最后一个
被视为一对,并在进一步处理之前被删除;为了防止这种情况,将另一个但转义的对放在周围,因此
…在(“^”“%ProgramFiles(x86)%\…”^中查找“…^”)…
..@aschipfl:
'C:\Program'未被识别为内部或外部命令、可操作程序或批处理文件。
.Doble检查方法是仅在第一个空格前添加“^:
'C:\Program Files'未被识别为内部或外部命令、可操作程序或批处理文件。
同时编辑了我的第一条评论…更好,因为错误消息已消失
 for /f "usebackq" %%i in (`"C:\Program^ Files^ ^(x86)\CodeMeter\Runtime\bin\cmu32.exe" --list-content ^| FIND "Serial Number 12345-"`) do SET foobar=%%i