在批处理文件的 for 循环中引用长文件名命令
Quoting a long filenamed command in a for loop in a batch file
已链接:
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 命令中匹配引号确实有些奇怪。只要您不开始在其他地方引用,您就可以引用命令...
可能吗?我尝试在不同的点转义,但我不确定涉及引号时的转义规则...
编辑:我认为这 link 可能是问题所在(即:这是一个错误):
>x64.txt ECHO x64
for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I /g:x64.txt`) do (
可能是一种变通方法,具体取决于您的实际应用和偏好。
首先,我要更改命令,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。
@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
用法的部分,解释引用删除行为。
已链接:
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 命令中匹配引号确实有些奇怪。只要您不开始在其他地方引用,您就可以引用命令...
可能吗?我尝试在不同的点转义,但我不确定涉及引号时的转义规则...
编辑:我认为这 link 可能是问题所在(即:这是一个错误):
>x64.txt ECHO x64
for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I /g:x64.txt`) do (
可能是一种变通方法,具体取决于您的实际应用和偏好。
首先,我要更改命令,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。
@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
用法的部分,解释引用删除行为。