Windowsのコマンドプロンプトから独自のプロセスpidを取得する方法


26

コマンドプロンプトから自分のPIDを取得する方法を見つけようとしています(後でバットスクリプトで使用するため)これまでのところ、私が見つけた唯一の有用な方法はここからgetpids.exeを使用することでした:http://www.scheibli.com/ projects / getpids / index.htmlしかし、Windowsに「組み込まれている」コマンドを探している

編集:「弾丸の証拠」の方法を探しています-私のプロセスが唯一のcmd.exeまたは何かであることについての仮定はありません

回答:


36

他のソリューションはいずれも防弾機能が組み込まれていないため、次のソリューションを提供すると思いましたが、結果を何らかの方法で解析/保存する必要があることに注意してください。

title mycmd
tasklist /v /fo csv | findstr /i "mycmd"

それは本当にすてきです。現在の時間+ランダムに生成された数字を防弾に近いタイトルとして設定できることをかなり確信しています
radai

3
スケジューラがバッチスクリプトを同時に2回呼び出す場合は、%random%+%time%を使用しないでください。同じスクリプトが異なるパラメーターで同時に呼び出されるという問題がありました。ランダムのシードは同じであり、一時ディレクトリを作成するときに衝突が発生しました。一時ディレクトリの作成時にエラーを処理する方法はありませんでした。要するに、スクリプトが同時に2回起動されないと想定できる場合、このトリックは機能するはずです。
ピーターシューツェ14

microsecondsこの場合、より正確なタイムスタンプ(%time%のような1/100秒ではなくを含む)を取得する方が信頼性が高い(深くテストされていない)場合があります:wmic os get LocalDateTime(YearMonthDayHourMinuteSecond.Microsecond + Timezone)。スケジューラない限り...まったく同じマイクロ秒で二つのことを実行することができます
ゴーティエBoaglio

タイトルがN / A
FrinkTheBrave

これは、親プロセスのPIDを提供します。
access_granted

7

ユーザーがWMICにアクセスでき、TEMPがユーザーが書き込み権限を持っている有効なパスをポイントしていれば、以下は防弾だと思います。これは、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

スクリプトは、現在の時刻を名前に組み込む一時ファイルに排他ロックを確立します。同じ名前のバッチプロセスのような2つのバッチプロセスが同じ0.01秒の時間間隔内でPIDを取得しようとした場合にのみ、衝突が発生する可能性があります。

失敗したプロセスは、ループバックを繰り返し、成功するまで新しいロックファイルパスで再試行します。

ロックファイルへのフルパスは、WMICクエリで使用できる一意のIDに変換されます。WMICは、FOR / Fコマンド内で実行されます。つまり、子のcmd.exeプロセスで実行されます。そのため、cmd.exeプロセスのParentProcessIDが取得されます。


7

トニー・ロスの答えを拡張する:

title uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do echo %f

WINDOWTITLEフィルターを使用するとパイプが回避されるため、forループに入れて、必要に応じてSETで変数に割り当てることができます。

title uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do set ourPID=%f

を削除/vすると処理が速くなり、/NHヘッダー行が削除されます。"uniqueTitle"ウィンドウのタイトルには実際に現在のコマンドが含まれているため、その後にワイルドカードが必要です(したがって、完全に一致させようとすると、繰り返し表示されます)。


6

PowerShell + WMIの使用:

powershell (Get-WmiObject Win32_Process -Filter ProcessId=$PID).ParentProcessId

いいね PowerShell Coreをお持ちの場合は、さらに簡単になります(ただし、どちらのコマンドも高速ではありません):pwsh -noprofile -c "(Get-Process -Id $PID).Parent.Id"
mklement

5
  1. Windowsタスクマネージャーでは、[表示]-> [列の選択]に移動して、[PID]を選択する必要があります。
  2. コマンドプロンプトで詳細なタスク情報を取得するには、「tasklist / v」。
  3. live.sysinternals.comのプロセスエクスプローラー。

2
@Vivek、コマンドプロンプトから...そして、あなたは答えを
だましてい

私はすべての可能なオプションを与えました..そして複製はしません..PowerShellについても言及できましたが、XPと2003ではデフォルトではないので自分を抑制しました。これがVista以降のOSの場合、Yes PowerShellが私の好みでした。
ビベッククンバル

5

cmd.exeが1つしか実行されていないことがわかっている場合は、次の方法でPIDを取得できます。

for /F "tokens=1,2" %%i in ('tasklist /FI "IMAGENAME eq cmd.exe" /fo table /nh') do set pid=%%j

echo %pid%

ありえない仮定のようなサウンドは、あなたのコードは、フレーク状ことができること
ラウル・サリナス- Monteagudo

ラウル、あなたの言っていることがわかります。多くの場合は安全ではありませんが、キオスクシステムや、起動していないプロセスを完全に制御しているVMなど、一部では安全です
zumalifeguard


3

imagename "notepad.exe"のPIDを検索する場合は、次のコードが役立ちます。

for /F "tokens=1,2" %i in ('tasklist') do (
 if "%i" equ "notepad.exe" (set x=%j)
)
echo %x%

2

Windows 2003リソースキットを持っている場合は、qgrepを使用して必要な行だけを取得します。次に、ここからpidを抽出できます(これは、一度に1つのcmdしか実行していないことを前提としています)

tasklist /v | qgrep cmd

cmd.exe 2040 RDP-Tcp#447 0 1,804 K Running MACHINE\Administrator  0:00:00 Command Prompt


0

これは、オープンCMDのプロセスIDを取得する簡単な方法です

tasklist /v /fi "imagename EQ cmd.exe" /FO LIST | FIND "PID:"

0

この回答はプロセスIDのみを提供し、トップの回答に含まれる余分なものはありません。

title mycmd
tasklist /v /fo csv | findstr /i "mycmd" > PIDinfo.txt

set /p PIDinfo=<PIDinfo.txt
set PID1=%PIDinfo:~11,5%
set PID2=%PIDinfo:~11,4%

if %PID2% gtr 8100 (
    set PID=%PID2%
) else (
    set PID=%PID1%
)

echo %PID%

説明:

-cmd.exeのPIDは18100より大きいため、PID2が8100より大きいかどうかを確認し、4桁か5桁かを確認します。

ケース1:17504のような5桁のPIDのPID1値は17504、PID2値は1750であるため、PID1を使用します

ケース2:8205のような4桁のPIDのPID1 valは8205 "、PID2 valは8205なので、PID2を使用します

ケース3:4352のような4桁のPIDのPID1 valは4352 "、PID2 valは4352なので、PID2を使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.