Windows 在批处理中使用双引号为循环传递多个参数?

Windows 在批处理中使用双引号为循环传递多个参数?,windows,for-loop,batch-file,double-quotes,multiple-arguments,Windows,For Loop,Batch File,Double Quotes,Multiple Arguments,我正在批处理脚本中使用MediaInfo CLI,我不知道问题出在哪里,但如果我使用的文件夹路径中有空格,则无法使此命令正常工作。我对批处理脚本并不陌生,多年来已经创建了数百个。通常我认为使用双引号可以解决这个问题,但我知道这与使用“for/f”命令和使用双引号传递多个参数有关。我已经尝试了我能想到的一切,但如果我使用的是带有空格的路径,它仍然无法工作。如果没有空间,它工作得很好,只是没有空间 请注意,这不是完整的批处理脚本,只是有问题代码的一个片段。我还将双“%%”变量更改为单“%”,以便于在

我正在批处理脚本中使用MediaInfo CLI,我不知道问题出在哪里,但如果我使用的文件夹路径中有空格,则无法使此命令正常工作。我对批处理脚本并不陌生,多年来已经创建了数百个。通常我认为使用双引号可以解决这个问题,但我知道这与使用“for/f”命令和使用双引号传递多个参数有关。我已经尝试了我能想到的一切,但如果我使用的是带有空格的路径,它仍然无法工作。如果没有空间,它工作得很好,只是没有空间

请注意,这不是完整的批处理脚本,只是有问题代码的一个片段。我还将双“%%”变量更改为单“%”,以便于在命令行上进行测试

另外,在批处理脚本中,我将输出到变量,而不是使用“echo”,这就是为什么我必须使用“for”命令的原因。所有这些都与这个具体问题无关

工作示例

for /f %g in ('C:\MediaInfo.exe "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"') do echo %g
for /f %g in ('"C:\folder with spaces\MediaInfo.exe" "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"') do echo %g

不起作用的示例

for /f %g in ('C:\MediaInfo.exe "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"') do echo %g
for /f %g in ('"C:\folder with spaces\MediaInfo.exe" "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"') do echo %g

两个“不工作”命令都会导致相同的错误

“C:\folder”未被识别为内部或外部命令, 可操作的程序或批处理文件


a的集合(即
do
之前的括号部分)中的命令实际上由执行,这可能会根据其位置删除潜在引号。 例如,在命令行中:

对于/f“delims=“%g in(“'C:\folder with spaces\mediainfound.exe”“--Inform=General;%MenuCount%”“D:\Some folder\filename.mkv“”)执行回显%g
外部引号对被删除,留下无效的命令行:

C:\folder with spaces\MediaInfo.exe”“--Inform=General;%MenuCount%“”D:\Some Folder\filename.mkv
如果您现在添加一对额外的引号,它将起作用。您甚至可以转义这些引号,而不必更改任何其他转义,以防:

对于/f“delims=“%g in('^“C:\folder with spaces\mediainfound.exe”“--Inform=General;%MenuCount%”D:\Some folder\filename.mkv“^”)执行回显%g

a的集合(即
do
之前的括号部分)中的命令实际上由执行,这可能会根据其位置删除潜在的引号。 例如,在命令行中:

对于/f“delims=“%g in(“'C:\folder with spaces\mediainfound.exe”“--Inform=General;%MenuCount%”“D:\Some folder\filename.mkv“”)执行回显%g
外部引号对被删除,留下无效的命令行:

C:\folder with spaces\MediaInfo.exe”“--Inform=General;%MenuCount%“”D:\Some Folder\filename.mkv
如果您现在添加一对额外的引号,它将起作用。您甚至可以转义这些引号,而不必更改任何其他转义,以防:

对于/f“delims=“%g in('^“C:\folder with spaces\mediainfound.exe”“--Inform=General;%MenuCount%”D:\Some folder\filename.mkv“^”)执行回显%g

对于/f“USEBACKQ Tokens=*delims=“%g in”(“C:\folder with spaces\mediainfound.exe”“--Inform=General;%MenuCount%”D:\Some folder\filename.mkv“)执行echo%g
对于/f“USEBACKQ delims=“%g in”(“C:\folder with spaces\mediainfound.exe”“--Inform=General;%MenuCount%”D:\Some folder\filename.mkv“)do echo%g
注意使用“而非”,在本上下文中,它用于包含命令的集合。@T3RR0R使用
usebackq
可以将
之后的部分解释为文字字符串,而不是要执行的命令;你需要的是`而不是。无论如何,这对目前的情况没有帮助……也许你误解了,我指的是“启用命令”。
for/f“USEBACKQ Tokens=*delims=“%g in”(“C:\folder with spaces\mediainfound.exe”“--Inform=General;%MenuCount%”D:\Some folder\filename.mkv“')do echo%g
for/f“USEBACKQ delims=“%g in('“C:\folder with spaces\MediaInfo.exe”“--Inform=General;%MenuCount%”“D:\Some folder\filename.mkv”“)do echo%g
注意使用“而非”,在本上下文中,它用于包含命令的集合。@T3RR0R,将
usebackq
一起使用
可以将
之后的部分解释为文字字符串,而不是要执行的命令;您将需要使用“相反”。无论如何,这在situa中没有帮助可能您误解了,我指的是“启用命令。虽然我不知道什么是
MediaInfo.exe
,但它应该可以工作,所以我无法判断它的命令行是否错误。对我来说,引用的部分是
”--Inform=General;%MenuCount%“
看起来有点奇怪--也许它应该读为
--Inform^=General^;%MenuCount%
(转义
^
仅在
for/F
循环中是必需的!)。变量
%MenuCount%
包含什么?无论如何,首先你应该尝试在
for/F
之外的命令行。很抱歉,我发布了我的评论,然后删除了它,因为我意识到我犯了一个错误。但是,是的,你的解决方案非常有效!我昨天花了好几个小时才弄明白。我使用了这么多年批处理脚本,这是我第一次遇到这个问题。我一定会将它添加到我的兵工厂中。=)好吧,它应该可以工作,尽管我不知道什么是
MediaInfo.exe
,所以我无法判断它的命令行是否错误。对我来说,引用的部分是
“--Inform=General;%MenuCount%“
看起来有点奇怪--也许它应该读为
--Inform^=General^;%MenuCount%
(转义
^
仅在
for/F
循环中是必需的!)。变量
%MenuCount%
包含什么?无论如何,首先您应该尝试在
for/F
之外的命令行。很抱歉,我发布了我的评论,然后删除了它,因为我意识到我犯了一个错误。但是,是的,您的解决方案是w