cmd taskkill 使用硬编码的 PID 值但不使用与变量相同的值

cmd taskkill work with hardcoded PID value but not with same value as variable

我在当前处理的 Windows 批处理脚本中遇到了一个奇怪的情况。

在本节中,我使用其子进程的名称 (%PROCESS_NAME%) 提取父进程的 PID。它运行良好,我可以毫无问题地回显 PARENT_PID :

for /f "usebackq tokens=2 delims==" %%a in (`wmic process where ^(name^='%PROCESS_NAME%'^) get parentprocessid /value`) do (
        set PARENT_PID=%%a
    )

echo !PARENT_PID!

结果显示预期值:

16392


问题在下一行:

taskkill /f /t /pid !PARENT_PID!

进程没有被终止并且脚本显示了一个奇怪的文本(我在法语环境中工作):

" est introuvable.sus "16392


如果我替换 !PARENT_PID!使用这样的硬编码 PID 值:

taskkill /f /t /pid 16392

一切正常,父进程及其子进程被杀死。

我尝试了很多东西,但无法弄清楚哪里出了问题。 如果有人有想法,我有兴趣kow,谢谢!

像这样尝试,你就会发现问题所在:

@echo off
setlocal enableDelayedExpansion
for /f "usebackq tokens=2 delims==" %%a in (`wmic process where "name='explorer.exe'" get parentprocessid /value`) do (
        set PARENT_PID=%%a
    )

echo -!PARENT_PID!-

WMIC 输出在末尾设置了一个额外的回车 return。 Here 您可以找到解决方法(使用额外的 for 循环):

@echo off
setlocal enableDelayedExpansion
for /f "usebackq tokens=2 delims==" %%a in (`wmic process where "name='explorer.exe'" get parentprocessid /value`) do (
        for /f "tokens=* delims=" %%# in ("%%~a") do set "PARENT_PID=%%#"
    )

echo -!PARENT_PID!-

我总是选择尝试防止问题发生,而不是稍后修复它。因此,这里有一些尝试克服不受欢迎的换行问题的替代建议。

如果你可以在目标 属性、 前后包含一个 属性(在本例中为 ParentProcessID),并且确保那些 'pre' 和 'post' 属性不会为 NULL,您可以在没有问题回车 return.

的情况下检索您的值

示例:

@Set "PPID="
@For /F "EOL=H Tokens=2" %%A In ('""%__AppDir__%wbem\WMIC.exe" Process Where Name="%PROCESS_NAME%" Get Handle,ParentProcessID,SessionID 2>NUL"')Do @Set "PPID=%%A"
@Set PPID 2>NUL
@Pause


或者,您可以使用 /Format 选项。

示例:

@Set "PPID="
@For /F "Skip=1 Tokens=2 Delims=," %%A In ('""%__AppDir__%wbem\WMIC.exe" Process Where Name="%PROCESS_NAME%" Get ParentProcessID /Format:CSV 2>NUL"') Do @Set "PPID=%%A"
@Set PPID 2>NUL
@Pause

注意: 我在 中发现了一个问题,即所需 .xsl 文件的位置是不正确。一种解决方法是将这些文件移动到正确的目录 \Windows\System32\wbem。或者找到它的位置并直接在值中指定它。在我用过的系统上,我在\Windows\System32\wbem\en-US中找到csv.xsl,所以你可以使用,(根据需要调整):

@Set "PPID="
@For /F "Skip=1 Tokens=2 Delims=," %%A In ('""%__AppDir__%wbem\WMIC.exe" Process Where Name="%PROCESS_NAME%" Get ParentProcessID /Format:"%__AppDir__%wbem\en-US\csv.xsl" 2>NUL"') Do @Set "PPID=%%A"
@Set PPID 2>NUL
@Pause