【问题标题】:For /F: Spaces in both filename and parameter [duplicate]对于 /F:文件名和参数中的空格 [重复]
【发布时间】:2017-11-07 09:56:08
【问题描述】:

在批处理文件中,我想为程序的单行输出设置一个变量 - 多个问题和互联网资源中解释了该任务。

在我的特定任务中,我想执行命令

"D:\__My Program\___My Program\Folder1\Folder2\..\..\FileVersion\FileVersion\bin\Release\FileVersion.exe" /n "D:\__My Program\___My Program\Folder1\Folder2\bin\Deploy\My Program.exe"

如您所见,我要执行的程序的路径FileVersion.exe 包含空格,传递给FileVersion.exe 的第二个参数也包含带空格的完整路径。

当我直接在命令行或在批处理文件中使用CALL 调用上述命令时,它会正确执行程序并打印出预期的输出。

现在,为了捕获执行程序的输出,我使用以下批处理命令

FOR /F "usebackq tokens=* delims=" %%i IN (`"D:\__My Program\___My Program\Folder1\Folder2\..\..\FileVersion\FileVersion\bin\Release\FileVersion.exe" /n "D:\__My Program\___My Program\Folder1\Folder2\bin\Deploy\My Program.exe"`) DO (
    echo %%i
)

FOR documentation

usebackq     Use the alternate quoting style:                        
           - Use double quotes for long file names in "filenameset".
           - Use single quotes for 'Text string to process'
           - Use back quotes for `command to process`

我认为我通过在命令周围使用反引号并在文件名周围使用引号来正确地做到了这一点。

但是,调用失败并显示消息(从德语翻译)

The command "D:\My" is either incorrect or couldn't be found.

我认为这表明转义空间存在问题。

奇怪的部分:如果我替换要调用的 exe 的路径,或者用路径 sans 空格替换参数,它就可以工作。所以两者都

FOR /F "usebackq tokens=* delims=" %%i IN (`FileVersion.exe /n "D:\__My Program\___My Program\Folder1\Folder2\bin\Deploy\My Program.exe"`) DO (
    echo %%i
)

FOR /F "usebackq tokens=* delims=" %%i IN (`"D:\__My Program\___My Program\Folder1\Folder2\..\..\FileVersion\FileVersion\bin\Release\FileVersion.exe" /n Test.exe`) DO (
    echo %%i
)

工作。

为什么两个引号转义的字符串不能在同一个命令中工作,我该如何解决?

【问题讨论】:

  • 我不确定我明白使用反引号的目的!
  • 看看this是否能解决你的问题。
  • Compo:这没什么区别。 @MCND 你的。我确信必须有一个资源来回答它,但是在筛选示例时我没有找到它。谢谢。我会将其标记为重复。
  • 这个例子似乎比这个问题更复杂一些(因为 caret 字符和重定向器运算符)。翻译成我们这里的内容:for /f "tokens=*" %%f in ('""D:\__My Program\___My Program\Folder1\Folder2\..\..\FileVersion\FileVersion\bin\Release\FileVersion.exe" /n "D:\__My Program\___My Program\Folder1\Folder2\bin\Deploy\My Program.exe""') DO (... .
  • @CristiFati 是的,在整个事情周围加上双引号,同时在每个路径周围添加引号也是我使用的解决方案。这是链接问题的已接受答案中的第一个示例。

标签: windows batch-file command-line command-line-arguments


【解决方案1】:

我不会使用usebackq 并首先解决复杂路径:

@Echo off
Pushd "D:\__My Program\___My Program\Folder1\Folder2\..\..\FileVersion\FileVersion\bin\Release"
FOR /F "tokens=*" %%i IN (
  ' FileVersion.exe /n "D:\__My Program\___My Program\Folder1\Folder2\bin\Deploy\My Program.exe" '
) DO echo %%i
PopD

【讨论】:

    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 2012-01-28
    • 2015-03-08
    • 2011-01-19
    • 2012-09-29
    • 2016-11-26
    • 2020-08-25
    相关资源
    最近更新 更多