Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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 SC查询在批处理文件中使用时返回错误';对于';环_Windows_For Loop_Batch File_Service_Find - Fatal编程技术网

Windows SC查询在批处理文件中使用时返回错误';对于';环

Windows SC查询在批处理文件中使用时返回错误';对于';环,windows,for-loop,batch-file,service,find,Windows,For Loop,Batch File,Service,Find,尝试在批处理文件FOR循环中使用以下代码行: FOR /F "delims=" %%g IN ('sc query type=service ^| FIND /I "bthserv"') DO ( ECHO %%g ) 从CMD提示符使用时,括号中的命令可以成功运行 但是,在FOR循环中,它只返回: [SC]EnumQueryServicesStatus:OpenService失败123: 文件名、目录名或卷标语法不正确 是否有人熟悉此错误以及如何让FO

尝试在批处理文件FOR循环中使用以下代码行:

FOR /F "delims=" %%g IN ('sc query type=service ^| FIND /I "bthserv"') DO ( ECHO %%g )
从CMD提示符使用时,括号中的命令可以成功运行

但是,在FOR循环中,它只返回:

[SC]EnumQueryServicesStatus:OpenService失败123:

文件名、目录名或卷标语法不正确

是否有人熟悉此错误以及如何让FOR循环报告具有特定或类似名称的所有服务

[编辑]

即使将命令更改为该命令也会失败,并显示相同的消息:

FOR /F "delims=" %%g IN ('sc query type^= service ^| FIND /I "bthserv"') DO ( ECHO %%g )

首先,您的标题令人困惑,因为它使用的是
queryex
而不是
query

除了
query type=service
无效之外,它还应该是
query type=service
,(需要
=
后面的空格)

但是,您的命令也让我有点困惑,我不确定您是否想知道是否有名为
bthserv
的活动服务,或者是否有名为包含不区分大小写字符串
bthserv
的活动服务

如果你想知道是否有一个名为
bthserv
的活动服务,你应该直接按名称查询它,
querybthserv
。从那里,您可以简单地使用
&&
| |
来执行成功和失败的命令(我刚刚使用了下面的
Echo
命令)

例如:

@%\uuuu AppDir\uuuu%sc.exe query bthserv 1>NUL&&(Echo bthserv是已安装的服务)| Echo bthserv不是已安装的服务
或者,您可以使用
ErrorLevel

例如:

@%\uuuu AppDir\uuuuu%sc.exe查询bthserv 1>NUL
@如果错误级别1(Echo bthserv不是已安装的服务),则Echo bthserv是已安装的服务
如果您想知道是否有一个名称包含不区分大小写的字符串
bthserv
,(与之不匹配)的活动服务,则该命令可以

但是,当您在中运行该命令时,
=
字符被
cmd.exe
实例视为分隔符,该命令将传递给。因此,您需要使用插入符号(
^
)将其转义。除此之外,如果希望捕获匹配的服务名称,则需要使用默认和制表符分隔符选择第一个令牌之后的所有内容

例如:

@For/F“Tokens=1,*”%%G In('%\uuuuuuuu AppDir\uuuuu%sc.exe查询类型^=service^ |%\uuuuuu AppDir\uuuuuuu%find.exe/I“bthserv“)Do@Echo%%H
但是,您也可以将传递给
cmd.exe
实例的整个字符串括在双引号中,而不需要转义任何内容

例如:

@For/F“Tokens=1,*”%%G In(“%”“%%Echo%%H”

您需要避开
=
符号。当您发布此消息时,我正在@Squashman处整理答案。虽然你是正确的,但这并不是唯一的问题。合并了转义字符并修改了线程标题…而且,不需要
type=service
,因为它是默认选项,所以从技术上讲
type=
将完全相同。您是否确定您正在寻找的是
服务
类型
,而不是
驱动程序
,或者是为了安全起见
全部
,即
查询类型=全部
查询类型=驱动程序
@Arianax,我已回滚您的编辑。请不要使用问题区域包含问题的解决方案。为此,我们有一个答案区。您可以在该区域自由提供答案,如果您愿意,请选择它作为您接受的解决方案。请不要滥用或试图改变本网站目前的工作方式;谢谢。你测试过上面的命令了吗?在启用延迟扩展的批处理文件中使用时,会导致一系列错误。要么这样,要么我还在做错事。甚至不能让“SC Query type=service”运行,即使它不在for循环中,而是作为一个独立的命令在批处理中运行。这些命令都没有错@Arianax,你错了!我不需要测试它们,即使我有一台PC来测试它们,我知道它们是正确的。此外,它们都不受延迟扩展的影响,因为它们不使用在同一代码块中定义的变量。请不要完全改变你的问题,在你收到答案后再做改变。我修改了您的问题,以便在我回答时保留原始代码,并将您的更改添加为编辑。由于
错误123
文件名、目录名或卷标语法不正确。
,我觉得您没有使用我提供的确切代码,和/或您正试图查询尚未正确安装/创建/启动的服务。请提供到目前为止的其余代码,以便我们能够在我为您最初发布的代码提供的适当修复之外,进一步诊断您的问题。(您可以通过再次添加到[Edit/]部分来完成此操作)。如果您仍在使用
SC
而不是
SC.exe
或始终正确的
%\uuuuuu AppDir\uuuuu%SC.exe
?您可能会遇到问题,其中一个问题是您错误地将批处理文件命名为
sc.bat
sc.cmd
。这将有效地从脚本内部再次运行脚本,并使用
query…
作为其参数。(这显然是个问题)。另一个问题是,如果
%PATH%
%PATHEXT%
的内容被意外或其他方式修改了!请不要编辑我的帖子。我在我的编辑潜台词中提到了你和Squashman。您刚刚冗余地重新编辑了一个编辑。。。还有,我运行了你的代码。它不提供错误,但似乎什么也不做,也就是说,它不返回任何东西