Đóng chương trình từ dòng lệnh (Windows)


49

Cách thích hợp để đóng / thoát chương trình khỏi dòng lệnh, tương tự như nhấn nút đóng "X" ở góc cửa sổ là gì?

Tôi đang cố gắng đóng chrome dưới 3 phiên bản khác nhau của windows: win7 Ultimate, win7 home, winXP

Trong Ultimate và XP: TSKILL chrome

Dưới Trang chủ TASKKILL /IM chrome.exe


TSKILL chrome::

(Nó đóng chrome, không có lỗi cmd,
nhưng khôi phục lỗi chrome khi khởi chạy lại)


TASKKILL /IM chrome.exe:

(Nó đóng chrome, không có lỗi chrome khi chạy lại,
nhưng sai sót trong cmd: "không thể chấm dứt tiến trình con (khoảng 4-5), chỉ bằng vũ lực với /F")


Tôi có nên bỏ qua lỗi con cmd nếu trên khởi chạy lại Chrome chỉ cho tôi không có lỗi ?


@MosheKatz: Bạn có thể chỉ cho tôi một số ví dụ về mã thoát không? Tôi muốn biết điều gì xảy ra khi tôi nhấn nút X ..
neoDev

6
Taskkill gửi tin nhắn WM_CLOSE đến chương trình đích trừ khi / F (chấm dứt bắt buộc) được chỉ định, để cho phép chương trình có cơ hội tự dọn sạch. Kiểm tra điều này với Notepad - mở một notepad và nhập một cái gì đó ở đó và nhập "taskkill / im notepad.exe". Bạn sẽ thấy một dấu nhắc để lưu dữ liệu.
Scott Rhee

@ScottRhee: Tôi đã cố chạy nó mà không có / F, nhưng dường như là một đóng không hợp lý ... Tôi có sai không?
neoDev

@ScottRhee: Tôi cũng đang thử với Chrome! Đôi khi, khi tôi chạy lại nói "khôi phục các tab" trong một đường màu vàng theo URL tương tự như sau: backroom.bostonproductions.com/wp-content/uploads/2012/07/...
neoDev

@Roger Thật lạ khi tôi không nhận được tin nhắn đó với Taskkill / IM chrome.exe. Dù sao, tôi tin rằng bạn đã làm đúng. Tôi đã viết một câu trả lời dưới đây vì vậy hãy thử thay thế.
Scott Rhee

Câu trả lời:


43

Cách thích hợp để đóng / thoát chương trình cuối cùng phụ thuộc vào phần mềm. Tuy nhiên, nói chung, cách tốt nhất là các chương trình Windows sẽ đóng bất cứ khi nào chúng nhận được thông báo WM_CLOSE. Giải phóng bộ nhớ và đóng tay cầm đúng cách. Có những tin nhắn khác có thể báo hiệu sự đóng của ứng dụng, nhưng tùy thuộc vào tác giả của phần mềm, mỗi tin nhắn được xử lý như thế nào.

taskkill /IM process.exe

taskkill gửi tin nhắn WM_CLOSE và sau đó tùy thuộc vào ứng dụng có đóng đúng không. Bạn cũng có thể muốn sử dụng /Ttùy chọn để báo hiệu các tiến trình con.

Chỉ sử dụng /Ftùy chọn nếu bạn muốn buộc chấm dứt quá trình.

Các tùy chọn khác sẽ bao gồm gửi các phím Alt + F4, sử dụng PowerShell hoặc các ứng dụng của bên thứ 3.

Cập nhật câu hỏi cập nhật

Bỏ qua, các lỗi. Chrome tạo ra nhiều quy trình. Các lỗi được gây ra khi một quá trình không thừa nhận thông điệp WM_CLOSE mà TASKKILL gửi. Chỉ các quy trình có vòng lặp thông báo mới có thể nhận được tin nhắn, do đó, các quy trình không có vòng lặp thông báo sẽ tạo ra lỗi đó. Nhiều khả năng, các quá trình này là các phần mở rộng và plugin chrome.

Để ẩn các lỗi chụp đầu ra

taskkill /IM chrome.exe >nul

Tóm tắt: TASKKILL là cách thích hợp thông qua dòng lệnh để đóng các ứng dụng theo triển khai WM_CLOSE của nó và Microsoft KB mà tôi đã liên kết .


Tôi đã cập nhật câu hỏi của mình, xin vui lòng xem nó
neoDev

@Roger cập nhật câu trả lời của tôi.
David Ruhmann

nó có nghĩa là gì> nul?
neoDev

10
>là toán tử chuyển hướng cho cmd.exe và nullà khoảng trống của không gian nơi mọi thứ sẽ không bao giờ được nghe lại.
David Ruhmann

9

Hãy dùng thử NirCmd (Tải xuống: x86 x64 )

Nó có lệnh "close process" được thiết kế để đóng các tiến trình một cách duyên dáng. Theo tài liệu của mình, nó không chấm dứt các ứng dụng mà gửi WM_CLOSEđến tất cả các cửa sổ cấp cao nhất của quy trình mục tiêu.

ví dụ sử dụng:

nircmd đóng tiến trình chrome.exe

Nếu điều này không hiệu quả, tôi cá là ứng dụng của bạn có quy trình dọn dẹp bất thường. Tôi muốn xem những gì xảy ra bên trong vì vậy xin vui lòng cho tôi biết ứng dụng mục tiêu của bạn là gì.


Tôi đã cập nhật câu hỏi của mình, xin vui lòng xem nó
neoDev

Tôi thấy điều này hoạt động tốt hơn: nircmd giành được danh hiệu gần gũi "Tiêu đề quá trình của tôi"
user1495323

4
What is the proper way to close/exit programs from command line,
similar to pressing the "X" close button in the corner of the window?

Câu trả lời cho câu hỏi đó có thể được tìm thấy here( liên kết Microsoft ).

Bạn có thể gửi WM_CLOSEtin nhắn đến bất kỳ cửa sổ nào bạn muốn đóng. Nhiều cửa sổ xử lý WM_CLOSEđể nhắc người dùng lưu tài liệu.

Một công cụ thực hiện điều này một cách chính xác là @Kill. Nhìn cũng gửi SendMsg .


Tôi không biết làm thế nào để làm điều này theo đợt, nhưng bạn có thể sử dụng vbscript cho việc này. Mô phỏng các phím Alt+ F4(tương đương với tín hiệu WM_CLOSE).

Chạy và xem xét hành vi của kịch bản này dưới đây.

Set WshShell = WScript.CreateObject("WScript.Shell")

' Start Notepad.exe
WshShell.Run "%windir%\notepad.exe"

' Select, or bring Focus to a window named `Notepad`
WshShell.AppActivate "Notepad"

' Wait for 4 seconds
WScript.Sleep 4000

WshShell.SendKeys "Foo"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "Bar"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "{CAPSLOCK}"
WshShell.SendKeys "baz"
WshShell.SendKeys "%{F4}"

Here là tên khóa danh sách cho SendKeys.

Khi bạn chạy tập lệnh, notepad sẽ mở, một số từ được viết và sau đó tín hiệu để đóng chương trình được gửi, xem hình dưới đây.


Câu hỏi thêm

Tôi có thể bắt đầu một chương trình thu nhỏ, hoặc nền với vbscript không?

Đúng. Sử dụng mã sau đây:

WshShell.Run "%windir%\notepad.exe", 2

Để biết thêm thông tin kiểm tra Run Method.

Chrome có thể đi đến một số url trong vbscript không?

Dim iURL  
Dim objShell iURL = "www.google.com"
set objShell = CreateObject("Shell.Application") 
objShell.ShellExecute "chrome.exe", iURL, "", "", 1

Nếu chrome là mặc định, sử dụng:

set objShell = CreateObject("WScript.Shell")
objShell.run(iURL)

Source

Có cách nào để tập trung vào ứng dụng cụ thể ( chrome.exe ) không?

Here trong một ví dụ

Tôi muốn gửi CHỈ alt + f4 tới chrome, độc lập với việc tôi đang làm với các cửa sổ khác.

Đoạn mã sau hoạt động trên Windows 8 .

Dim objShell

iURL = "www.google.com.br"

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run(iURL)

' Select, or bring Focus to Google Chrome
WshShell.AppActivate "Google Chrome"

' Wait for 5 seconds
WScript.Sleep 5000

WshShell.SendKeys "%{F4}"

Tôi có thể bắt đầu một chương trình thu nhỏ, hoặc nền với vbscript không?
neoDev

1
@Roger Nếu quan tâm, hãy xem câu trả lời của tôi ở đây về cách kết hợp Batch + JScript vào một tệp duy nhất. JScript có thể làm hầu hết mọi thứ VBScript có thể làm và theo kiểu C có cấu trúc hơn.
David Ruhmann

và chrome có thể đi đến một số url trong vbscript không?
neoDev

Có cách nào để tập trung vào ứng dụng cụ thể (chrome.exe) không?
neoDev

Có, tôi đang thử với nó, nhưng nếu sau một vài lần trì hoãn (WScript.S ngủ 5000) tôi có (WshShell.AppActivate "google chrome"), nếu trong khoảng thời gian này tôi nhấp vào một cửa sổ khác, google chrome không xuất hiện trước , tôi chỉ có thể thấy trọng tâm của nó trên thanh công cụ ....
neoDev

3

Có một số tiện ích dòng lệnh có thể gửi một WM_SYSCOMMANDthông điệp phù hợp (với SC_CLOSEtư cách là lệnh) đến cửa sổ cấp cao nhất của chương trình. Tôi chắc chắn rằng ít nhất một sẽ được đề cập trong thời gian ngắn. (Sau đó, ai đó sẽ đề cập đến AutoIt. Sau đó, sẽ có câu trả lời cho biết cách thực hiện với PowerShell và CloseMainWindow().)

Tiện ích dòng lệnh đi kèm như một lệnh tích hợp trong TCC của JP Software , trình thông dịch lệnh và bộ xử lý tập lệnh cho Windows, được gọi TASKEND.


Tôi đã cập nhật câu hỏi của mình, xin vui lòng xem nó
neoDev

2

Được rồi, sẽ không nói dối. Tôi đã thấy điều này trên stackoverflow và nghĩ rằng đó là một câu hỏi đầy thách thức. Tôi chỉ mất 2 giờ để viết một số mã. Và đây là ....

Sau khi làm theo các bước dưới đây, bạn có thể nhập "Nhiệm vụ đóng notepad.exe" sau khi nhấn "Bắt đầu" và nó sẽ tự động lưu tất cả các tệp notepad không có giấy tờ vào máy tính để bàn. Nó sẽ tự động đóng chrome.exe và lưu các cài đặt khôi phục.

Bạn có thể thêm và xóa cài đặt bổ sung cho các ứng dụng khác trong điều kiện if. Ví dụ:

If InStr(SINGLECLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"bypass","%{F4}"

ElseIf InStr(AUTOCLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"","%{F4}|%s|{autoname}.txt|%s"

'Example 1: =============================================
ElseIf InStr(WScript.arguments(0), "outlook") Then
    SmartSendKeys strOutput,"","%{F4}" 'Activate Alt+4
'========================================================

'Example 2: =============================================
ElseIf InStr(WScript.arguments(0), "notepad") Then 'I know, already in my autoapps
    SmartSendKeys strOutput,"","%{F4}|%s|{autosave}.txt" 'Activate Alt+4 + Save File + {AutoSave} = autoincrement filename
'========================================================

Else
    SmartSendKeys strOutput,"bypass","%{F4}"
End If

Các tập tin vbs và batch thực hiện các quy trình sau:

  • Thu thập thực thi.
  • Truy vấn tên ứng dụng thực thi ra khỏi danh sách tác vụ.
  • Thực hiện quy trình "Alt + TAB (x)" cho đến khi xác minh cửa sổ đang mở.
  • Sau đó, thực thi các lệnh cán cho dù đó là "Alt + F4" hoặc thậm chí trong trường hợp cực đoan
  • Alt + F4
  • Kích hoạt Lưu
  • Tên tệp AutoIncrememnt
  • Ứng dụng xuất cảnh.

ReturnAppList.bat: cài đặt trong "C: \ windows \ system32 \"

for /f "tokens=10 delims=," %%F in ('tasklist /v /fi "imagename eq %1" /fo csv') do @echo %%~F >>result.txt

TaskClose.bat: cài đặt trong "C: \ windows \ system32 \" VÀ "C: \ Users \ YourUserName \"

C:\windows\system32\wscript.exe c:\windows\system32\taskclose.vbs %1

TaskClose.vbs: cài đặt trong "C: \ windows \ system32 \"

Set WshShell = CreateObject("WScript.Shell")
Const SINGLECLOSEAPPS = "chrome.exe|iexplore.exe|firefox.exe"
Dim DEFAULTSAVELOCATION : DEFAULTSAVELOCATION = wshshell.SpecialFolders("Desktop")
Const AUTOCLOSEAPPS = "notepad.exe"

Const WshFinished = 1
Const WshFailed = 2
strCommand = "returnapplist.bat "
Set WshShellExec = WshShell.Exec(strCommand & WScript.Arguments(0))

WScript.sleep 2000

Select Case WshShellExec.Status
    Case WshFinished
    strOutput = LoadStringFromFile("result.txt")
    Case WshFailed
    strOutput = LoadStringFromFile("result.txt")
End Select


'SmartSendKeys(application_name_array, bypassclause, additionalcommands)
'========================
If InStr(SINGLECLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"bypass","%{F4}"
ElseIf InStr(AUTOCLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"","%{F4}|%s|{autoname}.txt|%s"
Else
    SmartSendKeys strOutput,"bypass","%{F4}"
End If




'SmartSendKeys(application_name_array, bypassclause, additionalcommands)
'========================
Function SmartSendkeys(fArr, LoopCount, RollCommands) 
    Dim x 
    Dim splt : splt = Split(farr, vbCrLf)
    If loopcount = "bypass" Then 
        x = 0
    Else
        x = UBound(splt)
    End If
    a = 0
    For s=0 To x
        If Len(splt(s)) > 1 Then
            Set objShell = WScript.CreateObject("WScript.Shell")
            c = 1 : tabs = ""
            Success = False
            Do Until Success = True
                Success = objShell.AppActivate(Trim(splt(s)))
                If success <> True Then
                    If c = 1 Then 
                        tabs = "{TAB}"
                    Else
                        tabs = "{TAB " & c & "}"
                    End If
                    'wscript.echo "Activating: " & "%" & tabs
                    WshShell.SendKeys "%" & tabs
                    WScript.Sleep 5000
                    c = c + 1
                    If c = 100 Then 
                        WScript.echo "App not found"
                        Exit Function
                    End If
                End If
            Loop
            Dim cmds : cmds = Split(rollcommands, "|")

            For Each cm In cmds
                If InStr(cm, "{autoname}") Then
                    Dim file_ext : file_ext = Split(cm, ".") 
                    cm = DEFAULTSAVELOCATION & "autosave" & a & "." & file_ext(1)
                    a = a + 1
                End If
                WshShell.SendKeys cm
                WScript.sleep 500

            Next
        End If
    Next
End Function

Function LoadStringFromFile(filename)
    Const fsoForReading = 1
    Const fsoForWriting = 2
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(filename, fsoForReading)
    Dim fulltext : fulltext = f.ReadAll
    LoadStringFromFile = fulltext
    f.Close
    fso.DeleteFile(filename)
End Function

Điều này thật thú vị để viết và tôi hạnh phúc hơn khi hoàn thành nó hơn là thực sự hiển thị câu trả lời. Có một tuần tuyệt vời!

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.