在批处理文件中的for循环中引用长文件名命令

时间:2016-11-13 18:06:14

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

链接:

Best free resource for learning advanced batch-file usage?

Dealing with quotes in Windows batch scripts

这似乎是令人抓狂的引用问题之一。在这个示例程序中:

@echo off
set wmicpath=%windir%\System32\wbem\wmic.exe

for /f "usebackq" %%a in (`%wmicpath% COMPUTERSYSTEM GET SystemType ^| findstr /I "x64"`) do (
    echo %%a
)

程序运行得很好。除非你试图引用wmicpath。想象一下,如果你将它包含一个长路径名称。然后你应该引用它。但我无法让它发挥作用。这失败了:

for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I "x64"`) do (

但这有效!:

for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I x64`) do (

就像这样:

for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType`) do (

在for命令中匹配引号真的很奇怪。只要你不在其他地方开始引用,你就可以引用一个命令......

有可能吗?我试图在各个方面逃避,但我不确定涉及报价的逃避规则......

编辑:我认为此链接可能是问题(即:它是一个错误):Pipe in for loop breaks double quoted variables

3 个答案:

答案 0 :(得分:3)

@echo off
    setlocal enableextensions disabledelayedexpansion
    set "wmicpath=%windir%\System32\wbem\wmic.exe"

    for /f "usebackq delims=" %%a in (`
        ^""%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I "x64"^"
    `) do (
        echo %%a
    )

如果查看内部命令的开头和结尾,您将看到另外两个^"(转义双引号)。您的问题是for命令正在生成一个单独的cmd实例来处理内部命令,而这个单独的实例正在删除初始和最终的双引号。

为什么要转义报价?要避免这些额外的引号与命令中的双引号配对,这可能会导致其他一些解析问题。

您可以运行cmd /?以获取帮助页面(抱歉,我有一个西班牙语语言环境,因此我不会在此处包含输出)。您将看到有关/C/K用法解释引用删除行为的部分。

答案 1 :(得分:1)

首先,我会更改命令,WMIC允许您使用查询语言LIKE运算符,在这种情况下,不需要管道任何东西。

@Echo Off
Set "WMIC=%SystemRoot%\System32\Wbem\wmic.exe"
For /F "UseBackQ Skip=1" %%a In (
    `""%WMIC%" ComputerSystem Where "SystemType Like 'x64%%'" Get SystemType"`
) Do For %%b In (%%a) Do Echo=%%b
Timeout -1

然后我甚至可以改变命令的格式,这样我就不会使用引号。

@Echo Off
Set "WMIC=%SystemRoot%\System32\Wbem\wmic.exe"
For /F "Skip=1" %%a In (
    '""%WMIC%" ComputerSystem Where (SystemType Like "x64%%") Get SystemType"'
) Do For %%b In (%%a) Do Echo=%%b
Timeout -1

虽然这并没有直接回答主题标题中的问题,但它确实允许您的特定命令正常工作。

但是您的特定命令示例都不需要,因为您不需要for循环来回显该输出:

@Echo Off
Set "WMIC=%SystemRoot%\System32\Wbem\wmic.exe"
"%WMIC%" ComputerSystem Get SystemType|Find /I "x64"
Timeout -1

如果您认为有需要,请将Find更改为FindStr。

答案 2 :(得分:0)

>x64.txt ECHO x64

for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I /g:x64.txt`) do (

可能是一种解决方法,具体取决于您的实际应用和偏好。