【问题标题】:Passing Multiple Arguments in a Batch FOR loop using Double Quotes?使用双引号在批处理 FOR 循环中传递多个参数?
【发布时间】:2020-05-19 11:29:22
【问题描述】:

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

请注意,这不是完整的批处理脚本,只是违规代码的 sn-p。我还将双“%%”变量更改为单“%”,以便在命令行上进行测试。

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

工作示例

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

.

for /f "usebackq delims=" %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 "usebackq delims=" %g in (`C:\folder with spaces\MediaInfo.exe "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"`) do echo %g

两个“NOT WORKING”命令导致相同的错误...

'C:\folder' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

【问题讨论】:

  • for /f "USEBACKQ Tokens=* delims=" %g in ('"C:\folder with spaces\MediaInfo.exe" "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"') do echo %gfor /f "USEBACKQ delims=" %g in ('"C:\folder with spaces\MediaInfo.exe" "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"') do echo %g
  • 请注意使用 ' 而不是 `,在这种情况下,它是用于包含命令的集合。
  • @T3RR0R,使用usebackq'in 之后的部分被解释为文字字符串,但不是要执行的命令;您将需要 ` 代替。无论如何,这对手头的情况没有帮助......
  • 可能你误会了,我指的是`启用命令。

标签: windows for-loop batch-file double-quotes multiple-arguments


【解决方案1】:

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

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

外部的一对引号被删除,留下无效的命令行:

C:\folder with spaces\MediaInfo.exe" "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv

如果您现在添加一对额外的引号,它将起作用。您甚至可以转义这些引号,而不必更改任何其他转义以防万一:

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

【讨论】:

  • 嗯,它应该可以工作,虽然我不知道MediaInfo.exe 是什么,所以我无法判断它的命令行是否错误。对我来说,引用的部分"--Inform=General;%MenuCount%" 看起来有点奇怪——也许它应该读作--Inform^=General^;%MenuCount%(转义^ 仅在for /F 循环中是必需的!)。变量%MenuCount% 包含什么?无论如何,首先你应该尝试for /F之外的命令行...
  • 对不起,我发布了我的评论,然后删除了它,因为我意识到我犯了一个错误。但是,是的,您的解决方案效果很好!我昨天花了几个小时在这上面,但无法弄清楚。这些年来我一直在使用批处理脚本,这是我第一次遇到这个问题。我一定会把它添加到我的武器库中。 =)
猜你喜欢
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多