2016-11-17 13 views
0

開いている各端末のPIDを取得する必要があります。現在実行中の端末のPIDを取得して変数に保存する最速の方法

私は今、作品に何かを持っています。しかし、正しいPIDを与えるわけではなく、少し遅いです。

@echo off 
rem Note: Session Name for privileged Administrative consoles is sometimes blank. 
if not defined SESSIONNAME set SESSIONNAME=Console 

setlocal 
set instance=%DATE% %TIME% %RANDOM% 
title %instance% 

rem PID Find 
for /f "usebackq tokens=2" %%a in (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERNAME%" /FI "WINDOWTITLE eq %instance%" ^| find /i "PID:"`) do set PID=%%a 
if not defined PID for /f "usebackq tokens=2" %%a in (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERNAME%" /FI "WINDOWTITLE eq Administrator: %instance%" ^| find /i "PID:"`) do set PID=%%a 
if not defined PID echo !Error: Could not get PID of current process. Exiting.& exit /b 1 

echo Here's the PID: %PID% 

私はそれを説明するかどうかはわかりませんが、これは実行されるたび、それはcmd.exeのPIDを与えるものではありませんが、それは全体のプロセス自体のPIDを返します。したがって、通常のcmdを実行した場合、正しいPIDが返されますが、Cmderのような別の端末を実行した場合、CmderのPIDは、cmd.exeでなくなります。

ループでwmicというループを使用するソリューションが多数ありましたが、動作させることができません。私が試してみるたびに、それが返すPIDは、実行するたびに常に異なっています。明らかに間違っています。

私は次のように使用することができ、そしてそれは、サードパーティ製の端末で動作し、私は上記の持っているものよりも高速です:

wmic process where "name='WMIC.exe'" get parentprocessid 

私はちょうど私がの出力のうち、PIDを抽出できるかどうかはわかりませんこの。端末のPIDを取得する方法はありますか?

WMIC /OUTPUT:temp.txt Process Where "Caption='WMIC.exe'" Get ParentProcessID 
For /F "Skip=1" %%A In ('Type temp.txt') Do If Not Defined PID Set "PID=%%A" 
Del temp.txt 
Echo=%PID% 

あなたが別のWMICのプロセスが実行される可能性があることを感じた場合Where "CommandLine Like…を使用するために、あなたのWMICコマンドを調整することができます。私のコメントでアイデアを使用して

+1

[this](https://github.com/npocmaka/batch.scripts/blob/master/hybrids/.net/getCmdPID.bat)を確認してください。現在のPIDをエラーレベル – npocmaka

+1

に返します。この[スレッド](http://www.dostips.com/forum/viewtopic.php?t=6133)もチェックしてください – npocmaka

+0

あなたのwmicコマンドは、あなたがドンした場合に必要なParentProcessIDを取得します効果的に別のcmd.exeプロセスを開始するforループ内で実行しないでください。 WMICコマンドの出力/出力が容易になる場合があります。 – Compo

答えて

2

。それはおそらく少し時間の増加を追加します。

0

私は、それぞれのオープンターミナルは、cmd.exeプロセスを意味すると仮定しています。

PS C:\src\powershell> (Get-WmiObject win32_process -Filter "Name='cmd.exe'").ProcessId 
6340 
6204 

これらのPIDで行う必要があることはありますか?

はい、これはcmd.exeシェルスクリプトで使用できます。

C:>powershell "(Get-WmiObject win32_process -Filter \"Name='cmd.exe'\").ProcessId" 
関連する問題