运行一个进程并返回批处理文件的 PID(作为 CHP.EXE)

运行一个进程并返回批处理文件的 PID(作为 CHP.EXE)

我正在寻找类似 chp.exe 的东西,它可以运行命令并返回其 pid。我不能使用 CHP.EXE,因为它似乎在某些防病毒软件中被报告为受感染文件。

谢谢

答案1

Wmic process where (Name like '%CHP%') get caption, name, commandline, ProcessId | more

真实样本:

Wmic process where (Name like '%ie%') get caption, name, commandline, ProcessId | more

输出:

ProcessId 类似于名称 Wmic Far 管理器

Wmic process get ProcessId

从查询输出中仅将 processId 提取到变量中:

进程ID.cmd:

@ECHO OFF                                                                              
FOR /F %%T IN ('Wmic process where^(Name^="explorer.exe"^)get ProcessId^|more +1') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId = %ProcessId%                                                           

输出:

ProcessId = 2372    

答案2

这在 PowerShell 中执行起来非常简单。Start-Process notepad.exe -PassThru将启动记事本并返回:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName                                                                                                                              
-------  ------    -----      ----- -----   ------     -- -----------                                                                                                                              
     45       6     1672       4240    61     0.02   9212 notepad   

从那里,您可以像对象一样使用它,通过存储输出($notepad = Start-process notepad.exe -PassThru然后$notepad.ID)并完成您正在用它执行的任何脚本。

将其恢复为批处理脚本(如果绝对必要)有点棘手。如果您绝对坚持使用批处理文件,最简单的方法可能是编写一个 PowerShell 脚本,将相关信息写入文件或注册表项,从批处理文件中调用 PowerShell 脚本,然后在批处理脚本中稍后读取文件或注册表项。

如果您根本不想接触 PowerShell,那么您将不得不在创建进程后求助于 WMIC 或任务列表来查找该进程。

答案3

另一种方法::您可以创建一个批处理文件并将以下代码放入批处理文件中。它首先运行 netstat 命令以获取端口 9797 的进程 ID。然后将其设置为变量。

@ECHO OFF                                                                              
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr "9797" ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId = %ProcessId%
PAUSE

答案4

您可以运行该程序,然后发出此命令,替换firefox.exe您想要的进程名称:

for /f "tokens=2" %a in ('tasklist /nh /fi "imagename eq firefox.exe"') do @if not [%a]==[No] @echo %a

它将仅输出进程号。在我的例子中,输出为5540。如果程序未运行,则不会返回任何输出。

相关内容