Saya percaya yang berikut ini anti peluru, asalkan pengguna memiliki akses ke WMIC dan TEMP menunjuk ke jalur yang valid di mana pengguna memiliki hak istimewa menulis. Ini adalah hasil akhir dari beberapa karya kolaboratif di 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
Script membuat kunci eksklusif pada file sementara yang menggabungkan waktu saat ini ke dalam nama. Hanya akan ada tabrakan jika dua proses batch bernama mencoba untuk mendapatkan PID dalam interval waktu 0,01 detik yang sama, dalam hal ini hanya satu yang akan berhasil.
Setiap proses yang gagal akan berulang kali berulang kembali dan coba lagi dengan jalur file kunci baru sampai berhasil.
Path lengkap ke file kunci diubah menjadi ID unik yang dapat digunakan dalam permintaan WMIC. WMIC dijalankan dalam perintah FOR / F, yang berarti itu berjalan dalam proses cmd.exe anak. Itu sebabnya ParentProcessID dari proses cmd.exe diambil.