我正在寻找类似 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
输出:
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
。如果程序未运行,则不会返回任何输出。