Bagaimana cara mengetahui argumen baris perintah dari program yang sedang berjalan?

78

Saya mencari alat atau metode untuk mengetahui parameter baris perintah apa yang telah diteruskan ke suatu program, misalnya ketika dijalankan oleh program lain (skenario peluncur-aplikasi).

Gepard
sumber

Jawaban:

70

Anda dapat melakukannya menggunakan Process Explorer .

Arahkan kursor Anda ke mouse untuk melihat argumen baris perintah yang digunakan untuk memulainya:
masukkan deskripsi gambar di sini

Atau, Anda dapat membuka properti proses dan memeriksa baris perintah di sana:
masukkan deskripsi gambar di sini

Der Hochstapler
sumber
2
Itu keren sekali.
cutrightjm
2
Sayangnya, sepertinya tidak berfungsi dengan aplikasi yang dilindungi dengan WinLicense / Themida: oreans.com/winlicense.php Ada ide lain?
Gepard
@Gepard: Bagaimana Anda tahu itu tidak berhasil? Apakah Anda yakin aplikasi itu, pada kenyataannya, dipanggil dengan argumen baris perintah? Either way, PE menggunakan cara Windows untuk menentukan informasi itu. Apa pun yang lain harus dibuat khusus untuk aplikasi tertentu, saya kira.
Der Hochstapler
6
Buruk saya, itu tidak menjalankan PE ditinggikan. Ini berfungsi sebagaimana dimaksud.
Gepard
@ OliverSalzburg, Bagaimana cara kerja program ini? Bisakah program C normal mencapai ini?
Pacerier
84

Anda dapat melakukannya tanpa Process Explorer, menggunakan layanan WMI Windows. Jalankan yang berikut dari command prompt:

WMIC path win32_process get Caption,Processid,Commandline

Jika Anda ingin membuang output ke file (membuatnya sedikit lebih mudah dibaca), gunakan tombol / OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline
Andy E
sumber
4
Bagus, bagaimana Anda tahu ini?
Pacerier
4
@ Passer: Saya tidak yakin jujur ​​;-) Saya pikir itu berasal dari menggali di sekitar dokumen WMI dan bermain-main karena saya perlu menggunakan WMI untuk sesuatu pada saat itu.
Andy E
3
Dokumen WMI mana yang Anda maksud?
Pacerier
3
Ini adalah metode baris perintah yang sangat membantu untuk mendapatkan baris perintah dari proses yang sedang berjalan. Dalam kasus saya, saya bisa men-tweak ini sedikit untuk mendapatkan output hanya untuk proses tertentu: WMIC path win32_process di mana "caption = 'cmd.exe'" get Commandline
chriv
1
Hebat, dan klausa mana sebenarnya mendukung beberapa fitur SQL, misalnya, di mana "name like 'cmd.%'
zhaorufei
35

Seseorang juga dapat mencapainya dengan menggunakan Task Manager .

Buka task manager (oleh CTRL-SHIFT-ESC, CTRL-ALT-DELETE atau metode lainnya).

Untuk Windows 7 (dan mungkin Windows XP):

  • Buka tab "Proses". Pada menu "Lihat", pilih "Pilih Kolom ...".
  • Centang kotak "Command Line" dan klik OK. (Anda mungkin harus gulir ke bawah untuk menemukannya)

Untuk Windows 8:

  • Buka tab "Detail". Klik kanan pada salah satu kolom (mis. Nama, PID dll.) Dan pilih "Pilih kolom".
  • Centang kotak "Command Line" dan klik OK. (Anda mungkin harus gulir ke bawah untuk menemukannya)

Kolom baris Perintah akan ditambahkan ke kolom yang saat ini ditampilkan.

Jeromy Adofo
sumber
1
Saya tidak benar-benar membuat Anda @JesseBarnum, Anda selalu dapat mengubah ukuran kolom untuk memiliki tampilan lengkap tidak peduli berapa lama baris perintahnya, bukan?
Jeromy Adofo
1
Hanya jika jendela cukup lebar untuk ukuran perintah. Jika perintahnya seperti proses Java dengan classpath yang panjang, itu tidak akan cocok dengan lebar jendela.
Jesse Barnum
1
Baiklah, terima kasih. Saya belum memiliki masalah itu dan omong-omong, task manager saya dapat digulir - tidak tahu tentang Anda :-). Saya pikir jika Anda dapat mengirim saya contoh program untuk dicoba, itu bisa menyelesaikannya.
Jeromy Adofo
5
Ini adalah jawaban yang sangat diremehkan, tidak tahu ini mungkin.
Hashim
3
Saya melihat beberapa komentar di atas tentang Windows Task Manager. Bahkan jika Anda mengatur kolom 'Baris perintah' untuk menunjukkan proses Java dengan baris perintah yang sangat panjang akan terpotong. TETAPI, Anda dapat mengklik baris di Task Manager dan 'menyalin' (Ctrl-c) seluruh baris dan menempelkan ini ke editor teks untuk melihat seluruh baris perintah, tidak peduli berapa lama.
JohnD
5

PowerShell untuk menyelamatkan.

Menemukan:

Get-WmiObject Win32_Process -Filter "name = 'perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\perl\bin\perl.exe" t/Server_PreFork.t'}

Dan bunuh sebagai bonus:

Get-WmiObject Win32_Process -Filter "name = 'perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\perl\bin\perl.exe" t/Server_PreFork.t'} | ForEach-Object { Invoke-WmiMethod -Path $_.__Path –Name Terminate }

Anda dapat menjalankannya dari PowerShell secara langsung atau dari PS1 jika Anda memiliki pengaturan sistem Anda. Saya merinci pengaturan skrip yang tidak dibatasi pada i kill zombie dengan PowerShell serta trik PowerShell lainnya ...

Dave Horner
sumber
1
Whoa ... bagian pembunuhannya cukup berbahaya, diberi judul pertanyaan;) Otheriwse jawaban yang sangat rapi;)
Tom
4

Jawaban sebelumnya bagus jika prosesnya sudah berjalan dan tidak akan segera berakhir. Namun, jika Anda perlu (seperti yang saya lakukan) untuk melakukan hal ini mungkin dengan proses memulai beberapa kali dan / atau dengan cepat berakhir, atau mungkin mencatat kejadian dalam periode waktu yang lebih lama, ada cara untuk ini menggunakan Proses Monitor .

Pada dasarnya ia mencatat berbagai peristiwa dalam sistem, dalam hal ini kita bisa memfilter acara "Proses Mulai" dan nama proses yang ingin kita pantau, seperti yang ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Kemudian biarkan monitor proses berjalan dan lakukan apa pun yang Anda lakukan untuk mendapatkan proses yang Anda ingin jalankan log. Anda dapat melihat kolom "Detail" atau kolom "Baris perintah" (tergantung pada cara Anda mengonfigurasinya) argumen baris perintah. Sebagai contoh:

masukkan deskripsi gambar di sini

Tentu saja dengan cara ini Anda dapat mengekstraksi lebih banyak informasi terkait seperti apa direktori kerja, variabel lingkungan apa yang telah diteruskan pada proses, dll ... Juga mudah untuk mengekspor hasilnya ke dalam file.

Sil
sumber
1

Saat menggunakan CygWin , jika saya memulai proses Python , ini adalah contoh baris perintah:

c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py

Tetapi Process Explorer hanya melihat exe utama:

Process Explorer tidak mendeteksi baris perintah penuh dari proses Python

(perhatikan "jalur: [Pesan proses pembukaan kesalahan]" (lihat EDIT-1)). Hasil yang sama untuk tasklist:

C:\>tasklist | find "python" /i
python2.7.exe                 5740 Console                    1    15.312 KB

Jadi, satu-satunya trik yang saya tahu sampai sekarang, adalah menemukannya melalui shell CygWin Bash pgrep :

Luis@Kenobi /cygdrive/c/
$ pgrep -f -l server.py
5740 /usr/bin/python2.7 /usr/local/bin/sudoserver.py

Sangat berguna untuk mengetahui hal ini, selama CygWin hidup bersama tanpa masalah di Windows, dan Anda dapat menggunakannya untuk menjalankan banyak program POSIX dan Python.

EDIT: Di Windows Anda tampaknya tidak memerlukan hak administrator untuk daftar tugas. Di CygWin Anda membutuhkan mereka untuk dapat melihat proses administrator (yang tampaknya lebih logis bagi saya: baris perintah lengkap dapat memiliki beberapa parameter seperti kata sandi di dalamnya), jadi kita harus menjalankan Bash CygWin dalam Mode Administrator yang ditinggikan .

EDIT-1: Masalah ini tidak akan terjadi jika Anda menjalankan Process Explorer sebagai administrator. Terima kasih telah menunjuk, @Pacerier.

Sopalajo de Arrierez
sumber
2
Jika Anda menjalankan sebagai administrator Anda tidak akan melihat[Error opening process message]
Pacerier
Anda benar, @Pacerier. Terlalu jelas untuk diingat :-). Terimakasih. Saya telah mengedit posting saya untuk mencerminkannya.
Sopalajo de Arrierez
-3

buka runatau goto startdan cari:

tasklist -m

tasklist -svc
Zanardan
sumber
5
Itu tidak menunjukkan baris perintah panggilan. /mmenunjukkan modul yang dimuat (DLL, dll.) dan /svcmenunjukkan layanan yang dihosting dalam setiap proses.
Bob