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
或者,您可以使用 wmic 的 /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
注意: 我在 windows-7 中发现了一个问题,即所需 .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
我在当前处理的 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
或者,您可以使用 wmic 的
/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
注意: 我在 windows-7 中发现了一个问题,即所需 .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