我在一个批处理文件中收到一个奇怪的行为调用wmic,我试图获取进程的ID,但是当我在like命令的字符串开头设置%%时,它返回随机数,但是当我最后使用它们的行为是正常的
我尝试了%%,%,^%,\%,但它们都不起作用。我已阅读的所有内容都表明我需要使用%%来对%进行转义,但我无法使其在字符串的开头起作用
@echo off
setlocal EnableDelayedExpansion
FOR /F %%i in ('dir /b/a-d/od/t:c omcp_*.log') do set "FILENAME=%%i"
FOR /F "usebackq" %%A IN ('%FILENAME%') DO set "SIZE=%%~zA"
set commie=0
IF DEFINED LASTFILENAME (
IF "%FILENAME%" == "%LASTFILENAME%" (
if DEFINED LASTSIZE (
IF "%SIZE%"=="%LASTSIZE%" (
->->-> for /f "UseBackQ tokens=2 delims==" %%f in (`wmic PROCESS WHERE "COMMANDLINE LIKE '%%winlog%%'" GET ProcessID /value ^| find "="`) do set "commie=%%f"
echo !commie!
IF !commie! equ 0 echo "subir monitor"
) else (
echo "re subir monitor"
)
)
)
)
set LASTFILENAME=%FILENAME%
set LASTSIZE=%SIZE%
REM setx LASTFILENAME FILENAME
REM setx LASTSIZE SIZE
当我仅使用最后的%%时,它会工作并返回winlogon进程的ID,如果我使用开始%%会发生这种情况,则实际输出是随机的,至少我认为是随机的;例如:8260,11576,8596,这与搜索的值无关
答案 0 :(得分:0)
这是对您的特定问题的解答,它不会处理您的代码中的其他问题,请参阅我的评论,或考虑到一旦解决,总体任务是否会像您一样打算这样做。
除了有问题的wmic行结尾问题,还暗示在注释中,您还需要考虑以下事实:在运行WMIC
命令时,您可以使用包含的字符串winlog
来实现。这意味着wmic.exe
进程CommandLine
也将与字符串winlog
匹配,因此您需要对此进行过滤。但是,由于WMIC
中带括号的For
命令也在单独的cmd.exe
实例中运行,因此cmd.exe
进程CommandLine
将包含{ {1}}命令,因此也使用字符串WMIC
。因此,您还需要在winlog
命令中对此进行过滤。
总而言之,问题中显示的三个WMIC
输出中的ProcessID
,8260
和11576
中的一个用于8596
过程,一个是winlogon
进程,另一个是cmd.exe
进程。
因此,我建议您将明确指出的有问题的行更改为:
wmic.exe
我通常更喜欢使用For /F EOL^=P %%A In ('WMIC Process Where "Name<>'cmd.exe' And Name<>'wmic.exe' And CommandLine Like '%%winlog%%'" Get ProcessID 2^>Nul')Do For %%B In (%%A)Do Set "commie=%%B"
或!=
这种格式,但是由于您启用了延迟扩展,因此我决定避免使用感叹号,而选择了较短的Not Name=
请注意,如果存在多个匹配过程,则不能期望此答案隔离<>
的特定实例。这也不能说明包含字符串CommandLine
的目标CommandLine
可能已通过winlog
的另一个实例运行的可能性。如果这两种可能性之一,那么您的整个方法都需要重新考虑。