回复 11# BAT-VBS
for /f 从命令中获取输入时,实际上是执行了一个 %comspec% /c xxxxxx,待进程退出后解析其输出,所以如果在 for /f 中执行 wmic 获得的将是 for /f 所创建的 cmd.exe 进程 pid。
要想通过 for /f 获取当前进程 pid,在原方案的基础上有三个延伸方案
1、用临时文件避免产生多余进程- wmic process where name="wmic.exe" get parentprocessid>tmp.txt
- for /f "skip=1" %%a in (tmp.txt) do echo %%a
复制代码 2、利用管道的特性,直接解析外部命令输出- wmic process where name="wmic.exe" get parentprocessid|for /f "skip=1" %%a in ('more') do echo %%a
复制代码 3、先获取 for /f 产生的进程pid- for /f "skip=1" %%a in ('"@for /f "skip=1" %%p in ('wmic process where name^="wmic.exe" get parentprocessid') do @wmic process where processid="%%p" get parentprocessid"') do echo %%a
复制代码 但是鉴于 wmic 无论在 xp 还是 win7 下输出都带有多余的回车符,所以建议在解析时这样过滤一下:- for /f %%a in ('copy /z "%~0" nul') do set "回车符=%%a"
- for /f "delims=%回车符%" %%a in ("wmic的输出.txt") echo %%a
复制代码 除了通过父进程 pid 和 batman 以脚本路径为依据的办法,还可以通过标题栏来获取:- set "title=%random%"
- title %title%
- tasklist /fi "windowtitle eq %title%"
- ::如果是以管理员权限运行的,则是 tasklist /fi "windowtitle eq 管理员: %title%*"
复制代码
|