即时通讯试图find一种方法来获得我自己的PID从命令提示符(以备后用于蝙蝠脚本)到目前为止唯一有用的方式,我发现是从这里使用getpids.exe: http : //www.scheibli.com/项目/ getpids / index.html但即时通讯寻找一个命令是“内置”的窗口
编辑:即时寻找“防弹”的方式 – 没有关于我的进程是唯一的cmd.exe或任何东西的假设
由于上述解决scheme都不是防弹和内置的,所以我想我会添加一些更接近防弹的小程序,但是您需要以某种方式parsing/保存结果
如果可以在batch file中执行此操作
title=mycmd tasklist /v /fo csv | findstr /i "mycmd"
我相信,以下是防弹的,只要用户有权访问WMIC和TEMP指向用户有写权限的有效path。 这是http://www.dostips.com/forum/viewtopic.php?f=3&t=6133上的一些协作工作的最终结果。
@echo off :getPID [RtnVar] :: :: Store the Process ID (PID) of the currently running script in environment variable RtnVar. :: If called without any argument, then simply write the PID to stdout. :: setlocal disableDelayedExpansion :getLock set "lock=%temp%\%~nx0.%time::=.%.lock" set "uid=%lock:\=:b%" set "uid=%uid:,=:c%" set "uid=%uid:'=:q%" set "uid=%uid:_=:u%" setlocal enableDelayedExpansion set "uid=!uid:%%=:p!" endlocal & set "uid=%uid%" 2>nul ( 9>"%lock%" ( for /f "skip=1" %%A in ( 'wmic process where "name='cmd.exe' and CommandLine like '%%<%uid%>%%'" get ParentProcessID' ) do for %%B in (%%A) do set "PID=%%B" (call ) ))||goto :getLock del "%lock%" 2>nul endlocal & if "%~1" equ "" (echo(%PID%) else set "%~1=%PID%" exit /b
该脚本在临时文件上build立一个独占锁,将当前时间合并到名称中。 如果两个命名批处理尝试在相同的0.01秒时间间隔内获得PID,则只能有一个冲突,在这种情况下,只有一个成功。
任何失败的进程都会重复循环,并重新尝试使用新的locking文件path,直到成功。
locking文件的完整path被转换为可在WMIC查询中使用的唯一ID。 WMIC在FOR / F命令中运行,这意味着它运行在一个cmd.exesubprocess中。 这就是检索cmd.exe进程的ParentProcessID的原因。
这应该做的伎俩:
tasklist / v
如果你已经有了Windows 2003资源工具包,可以通过qgrep来获取你想要的行。 然后你可以从这里提取pid(这里假设你一次只能运行一个cmd),
tasklist /v | qgrep cmd cmd.exe 2040 RDP-Tcp#447 0 1,804 K Running MACHINE\Administrator 0:00:00 Command Prompt
如果你知道只有一个cmd.exe在运行,你可以这样获得PID:
for /F "tokens=1,2" %%i in ('tasklist /FI "IMAGENAME eq cmd.exe" /fo table /nh') do set pid=%%j echo %pid%
拓展Tony Roth的答案:
title=uniqueTitle for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do echo %f
使用WINDOWTITLEfilter可以避免使用pipe道,所以你可以把它放在一个for循环中,如果你喜欢,可以把它赋给一个带SET的variables:
title=uniqueTitle for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do set ourPID=%f
删除/ v使得它更快,并且/ NH排除标题行。 在“uniqueTitle”之后需要通配符,因为窗口标题实际上包含了当前的命令(因此如果试图完全匹配它,它会继续下去)。
看看这个小批次的技巧 。 它将cmd的标题设置为一个特殊值,然后使用tasklist来查找它。 发明的
\\格雷格
如果你想findimagename“notepad.exe”的PID,那么下面的代码将适用于你:
for /F "tokens=1,2" %i in ('tasklist') do ( if "%i" equ "notepad.exe" (set x=%j) ) echo %x%
使用PowerShell + WMI:
powershell (Get-WmiObject Win32_Process -Filter ProcessId=$PID).ParentProcessId