Batch file 当存储在变量中时,如何正确转义plus%PROGRAMFILES(X86)%plus管道的多行输出plus
这在cmd中工作: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
"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