Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 在批处理文件的for循环中引用长filenamed命令_Windows_Batch File_For Loop_Double Quotes - Fatal编程技术网

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

Windows 在批处理文件的for循环中引用长filenamed命令,windows,batch-file,for-loop,double-quotes,Windows,Batch File,For Loop,Double Quotes,链接: 这似乎是一个引人发狂的问题。在本示例程序中: @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。想象一下,如果您愿意,它包含一个长路径名。那么你应该引用它。

链接:

这似乎是一个引人发狂的问题。在本示例程序中:

@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命令中匹配引号确实有些奇怪。您可以引用命令,只要您不在其他地方开始引用

可能吗?我在不同的地方尝试了转义,但我不确定当涉及引号时的转义规则

编辑:我认为这个链接可能是问题所在(即:它是一个bug):

可能是一种变通方法,具体取决于您的实际应用程序和首选项


这可能是一种解决方法,具体取决于您的实际应用程序和首选项。

首先,我将更改命令,WMIC允许您使用类似运算符的查询语言,在这种情况下,它将消除对任何管道的需要

@Echo关闭
设置“WMIC=%SystemRoot%\System32\Wbem\WMIC.exe”
对于/F“UseBackQ Skip=1”%%a英寸(
`“%WMIC%”计算机系统,其中“系统类型如“x64%%”获取系统类型`
)%%b的Do在(%%a)中做回显=%%b
超时-1
然后我甚至可以更改命令的格式,这样我就不用反引号了

@Echo关闭
设置“WMIC=%SystemRoot%\System32\Wbem\WMIC.exe”
对于/F“跳过=1”%%a,在(
““%WMIC%”计算机系统,其中(系统类型如“x64%%”)获取系统类型“'
)%%b的Do在(%%a)中做回显=%%b
超时-1
虽然这不能直接回答主题标题中的问题,但它确实允许您的特定命令正确工作

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

@Echo关闭
设置“WMIC=%SystemRoot%\System32\Wbem\WMIC.exe”
%WMIC%”计算机系统获取系统类型|查找/I“x64”
超时-1

如果您觉得有必要,请将Find更改为FindStr。

首先,我将更改命令,WMIC允许您使用类似运算符的查询语言,在这种情况下,它将不再需要管道传输任何内容

@Echo关闭
设置“WMIC=%SystemRoot%\System32\Wbem\WMIC.exe”
对于/F“UseBackQ Skip=1”%%a英寸(
`“%WMIC%”计算机系统,其中“系统类型如“x64%%”获取系统类型`
)%%b的Do在(%%a)中做回显=%%b
超时-1
然后我甚至可以更改命令的格式,这样我就不用反引号了

@Echo关闭
设置“WMIC=%SystemRoot%\System32\Wbem\WMIC.exe”
对于/F“跳过=1”%%a,在(
““%WMIC%”计算机系统,其中(系统类型如“x64%%”)获取系统类型“'
)%%b的Do在(%%a)中做回显=%%b
超时-1
虽然这不能直接回答主题标题中的问题,但它确实允许您的特定命令正确工作

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

@Echo关闭
设置“WMIC=%SystemRoot%\System32\Wbem\WMIC.exe”
%WMIC%”计算机系统获取系统类型|查找/I“x64”
超时-1
如果您觉得需要,请将Find更改为FindStr。

@echo off
setlocal enableextensions disabledelayedexpansion
设置“wmicpath=%windir%\System32\wbem\wmic.exe”
对于/f“usebackq delims=“%%a in(`
^“%wmicpath%”计算机系统获取系统类型^findstr/I“x64”^
`)做(
回声%%a
)
如果查看内部命令的开头和结尾,您将看到另外两个
^“
(转义的双引号)。您的问题是
for
命令正在生成一个单独的
cmd实例来处理内部命令,而这个单独的实例正在删除初始和最终的双引号

为什么要使用转义引号?为了避免额外的引号与命令中的双引号配对,从而导致其他一些解析问题

您可以运行
cmd/?
来获取帮助页面(很抱歉,我有一个西班牙语区域设置,所以这里不包含输出)。您将看到一个关于
/C
/K
用法的部分,解释引号删除行为。

@echo off
setlocal enableextensions disabledelayedexpansion
设置“wmicpath=%windir%\System32\wbem\wmic.exe”
对于/f“usebackq delims=“%%a in(`
^“%wmicpath%”计算机系统获取系统类型^findstr/I“x64”^
`)做(
回声%%a
)
如果查看内部命令的开头和结尾,您将看到另外两个
^“
(转义双引号)。您的问题是,
for
命令正在生成一个单独的
cmd
实例来处理内部命令,而这个单独的实例正在删除初始和最终的双引号

为什么不引用?为了避免额外的引号与命令中的双引号配对,从而导致其他一些解析问题


您可以运行
cmd/?
来获取帮助页面(很抱歉,我有一个西班牙语区域设置,所以我不会在这里包含输出)。您将看到一个关于
/C
/K
用法的部分,其中解释了引号删除行为。

关于WMIC,您是对的。干得好。我想如果我用一种特殊的方式做某件事,我会继续这样做,即使效率较低。我想他们称之为懒惰:-)我的例子你是对的,但在我的实际代码中,我存储了输出并进一步使用它。我承认你可能正在这样做,但是,据我所知,只有以下输出将基于你的问题选择的命令和查找标准,
x64-based
。因此,您可以将后一个示例与
&&
一起使用,以便在成功时设置该值<代码>%WMIC%”计算机系统获取系统类型|查找/I“x64”>Nul&&(基于设置var=x64)
。关于WMIC,您是对的。Nic
>x64.txt ECHO x64

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