Làm cách nào để tìm ra các đối số dòng lệnh của một chương trình đang chạy?


84

Tôi đang tìm kiếm một công cụ hoặc phương thức để tìm ra các tham số dòng lệnh nào đã được truyền cho một chương trình, ví dụ như khi nó được chạy bởi một chương trình khác (kịch bản ứng dụng launcher).

Câu trả lời:


71

Bạn có thể làm điều đó bằng cách sử dụng Process Explorer .

Chỉ cần di chuột bằng chuột trong một quá trình để xem các đối số dòng lệnh được sử dụng để khởi động nó:
nhập mô tả hình ảnh ở đây

Ngoài ra, bạn có thể mở các thuộc tính của quy trình và kiểm tra dòng lệnh ngay tại đó:
nhập mô tả hình ảnh ở đây


2
Điều đó thật tuyệt.
cutrightjm

2
Thật không may, nó dường như không hoạt động với các ứng dụng được bảo vệ bằng WinLicense / Themida: oreans.com/winlicense.php Bạn có ý tưởng nào khác không?
Gepard

@Gepard: Làm thế nào để bạn biết nó không hoạt động? Bạn có chắc chắn rằng ứng dụng này thực tế đã được gọi với các đối số dòng lệnh không? Dù bằng cách nào, PE sử dụng cách Windows để xác định thông tin đó. Bất cứ điều gì khác sẽ phải được tùy chỉnh cho một ứng dụng cụ thể, tôi giả sử.
Der Hochstapler

6
Thật tệ, nó không chạy được PE. Nó hoạt động như dự định.
Gepard

@OliverSalzburg, chương trình này hoạt động như thế nào? Bất kỳ chương trình C bình thường có thể đạt được điều này?
Pacerier

88

Bạn cũng có thể làm điều đó mà không cần Process Explorer, sử dụng dịch vụ WMI của Windows. Chạy phần sau từ dấu nhắc lệnh:

WMIC path win32_process get Caption,Processid,Commandline

Nếu bạn muốn kết xuất đầu ra vào một tệp (làm cho nó dễ đọc hơn một chút), hãy sử dụng công tắc / OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline

4
Đẹp, làm thế nào bạn biết điều này?
Pacerier

4
@Pacerier: Tôi không chắc chắn trung thực ;-) Tôi nghĩ rằng nó xuất phát từ việc đào xung quanh các tài liệu WMI và chơi xung quanh vì tôi cần sử dụng WMI cho một cái gì đó vào thời điểm đó.
Andy E

3
Những tài liệu WMI nào bạn đang đề cập đến?
Pacerier

3
Đây là một phương pháp dòng lệnh rất hữu ích để có được dòng lệnh của một tiến trình đang chạy. Trong trường hợp của tôi, tôi đã có thể tinh chỉnh điều này một chút để có được đầu ra chỉ cho một quy trình cụ thể: đường dẫn WMIC win32_ process trong đó "caption = 'cmd.exe'" lấy
Commandline

1
Tuyệt vời và mệnh đề where thực sự hỗ trợ một số tính năng SQL, ví dụ: trong đó "tên như 'cmd.%'
zhaorufei

39

Người ta cũng có thể đạt được điều đó bằng cách sử dụng Trình quản lý tác vụ .

Trình quản lý tác vụ mở (bằng CTRL-SHIFT-ESC, CTRL-ALT-DELETE hoặc bất kỳ phương thức nào khác).

Đối với Windows 7 (và có thể là Windows XP):

  • Chuyển đến tab "Quy trình". Trên menu "Xem", chọn "Chọn Cột ...".
  • Chọn hộp kiểm của "Dòng lệnh" và nhấp vào OK. (Bạn có thể phải cuộn xuống để tìm nó)

Đối với Windows 8:

  • Chuyển đến tab "Chi tiết". Nhấp chuột phải vào bất kỳ cột nào (ví dụ: Tên, PID, v.v.) và chọn "Chọn cột".
  • Chọn hộp kiểm của "Dòng lệnh" và nhấp vào OK. (Bạn có thể phải cuộn xuống để tìm nó)

Một cột các dòng lệnh sẽ được thêm vào các cột hiện được hiển thị.


1
Tôi thực sự không hiểu bạn @JlieBarnum, người ta luôn có thể thay đổi kích thước cột để có chế độ xem hoàn chỉnh cho dù dòng lệnh có dài bao nhiêu, phải không?
Jeromy Adofo

1
Chỉ khi cửa sổ đủ rộng cho kích thước của lệnh. Nếu lệnh là một cái gì đó giống như một quy trình Java với một đường dẫn dài, nó sẽ không vừa với chiều rộng cửa sổ.
Jesse Barnum

1
Được rồi cảm ơn, ghi chú. Mặc dù vậy, tôi chưa gặp phải vấn đề đó và nhân tiện, trình quản lý tác vụ của tôi có thể cuộn được - không biết về bạn :-). Tôi nghĩ rằng nếu bạn có thể gửi cho tôi một chương trình mẫu để thử, điều đó có thể giải quyết nó.
Jeromy Adofo

6
Đây là một câu trả lời bị đánh giá rất thấp, không biết điều này là có thể.
Hashim

4
Tôi thấy một vài ý kiến ​​ở trên về Trình quản lý tác vụ Windows. Ngay cả khi bạn đặt cột 'Dòng lệnh' để hiển thị một quy trình Java với một dòng lệnh thực sự dài sẽ bị cắt ngắn. NHƯNG, bạn có thể nhấp vào hàng trong Trình quản lý tác vụ và 'sao chép' (Ctrl-c) toàn bộ hàng và dán phần này vào trình soạn thảo văn bản để xem toàn bộ dòng lệnh, bất kể bao lâu.
JohnD

6

PowerShell để giải cứu.

Tìm thấy:

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

Và giết như tiền thưởng:

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 }

Bạn có thể chạy nó từ powershell trực tiếp hoặc từ ps1 nếu bạn đã thiết lập hệ thống. Tôi mô tả chi tiết thiết lập kịch bản không giới hạn về việc tôi tiêu diệt zombie bằng các quyền hạn cũng như các thủ thuật sức mạnh khác ...


1
Whoa ... phần giết người khá nguy hiểm, được đặt tiêu đề của câu hỏi;) Khác trả lời rất gọn gàng;)
Tom

5

Câu trả lời trước là rất tốt trong trường hợp quá trình đã chạy và sẽ không chấm dứt sớm. Tuy nhiên Nếu bạn cần (như tôi đã làm) để làm điều này có lẽ với các quy trình khởi động nhiều lần và / hoặc nhanh chóng chấm dứt, hoặc có thể ghi nhật ký xảy ra trong một khoảng thời gian dài hơn, có một cách để sử dụng Trình theo dõi quy trình này .

Về cơ bản, nó ghi nhật ký các sự kiện khác nhau trong hệ thống, trong trường hợp này chúng ta chỉ có thể lọc sự kiện "Bắt đầu quá trình" và tên của quá trình chúng ta muốn theo dõi, như được hiển thị bên dưới:

nhập mô tả hình ảnh ở đây

Sau đó, chỉ cần giữ cho trình giám sát quy trình chạy và làm bất cứ điều gì bạn làm để có được quá trình bạn muốn đăng nhập đang chạy. Bạn có thể thấy trong cột "Chi tiết" hoặc cột "Dòng lệnh" (tùy thuộc vào cách bạn định cấu hình chúng) các đối số dòng lệnh. Ví dụ:

nhập mô tả hình ảnh ở đây

Tất nhiên theo cách này, bạn có thể trích xuất nhiều thông tin liên quan hơn như thư mục làm việc là gì, biến môi trường nào đã được truyền trong quá trình, v.v ... Ngoài ra, thật dễ dàng để xuất kết quả vào một tệp.


1

Khi sử dụng CygWin , nếu tôi bắt đầu một quy trình Python , đây là một ví dụ về dòng lệnh:

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

Nhưng Process Explorer chỉ thấy exe chính:

Process Explorer không phát hiện dòng lệnh đầy đủ của quy trình Python

(lưu ý "đường dẫn: [Thông báo quá trình mở lỗi]" (xem EDIT-1)). Kết quả tương tự cho tasklist:

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

Vì vậy, mẹo duy nhất tôi biết cho đến bây giờ, là tìm nó thông qua trình bao CygWin Bash pgrep :

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

Thật hữu ích khi biết điều này, miễn là CygWin sống thử không có vấn đề gì trong Windows và bạn có thể sử dụng nó để chạy nhiều chương trình POSIX và Python.

EDIT: Trong Windows, bạn dường như không cần quyền riêng tư của quản trị viên cho danh sách tác vụ. Trong CygWin, bạn sẽ cần chúng để có thể xem quy trình của quản trị viên (điều có vẻ hợp lý hơn với tôi: dòng lệnh đầy đủ có thể có một số tham số như mật khẩu bên trong), vì vậy chúng tôi phải chạy CygWin Bash trong Chế độ quản trị viên nâng cao .

EDIT-1: Vấn đề này sẽ không xảy ra nếu bạn chạy Process Explorer với tư cách quản trị viên. Cảm ơn bạn đã chỉ, @Pacerier.


2
Nếu bạn chạy với tư cách quản trị viên, bạn sẽ không thấy[Error opening process message]
Pacerier

Bạn đã đúng, @Pacerier. Quá rõ ràng để nhớ :-). Cảm ơn bạn. Tôi đã chỉnh sửa bài viết của mình để phản ánh nó.
Sopalajo de Arrierez

-3

đi đến runhoặc goto startvà tìm kiếm:

tasklist -m

tasklist -svc

5
Điều đó không hiển thị dòng lệnh gọi. /mhiển thị các mô-đun được tải (DLL, v.v.) và /svchiển thị các dịch vụ được lưu trữ trong mỗi quy trình.
Bob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.