ปิดโปรแกรมจากบรรทัดคำสั่ง (Windows)


49

วิธีที่เหมาะสมในการปิด / ออกโปรแกรมจากบรรทัดคำสั่งคล้ายกับการกดปุ่ม "X" ปิดที่มุมของหน้าต่างคืออะไร?

ฉันกำลังพยายามปิดโครเมี่ยมภายใต้ windows 3 รุ่น: win7 ultimate, win7 home, winXP

ภายใต้ Ultimate และ XP: TSKILL chrome

ภายใต้หน้าแรกTASKKILL /IM chrome.exe


TSKILL chrome::

(มันปิดโครเมี่ยมไม่มีข้อผิดพลาด cmd
แต่ข้อผิดพลาดของโครเมี่ยมเรียกคืนเมื่อเปิดใหม่)


TASKKILL /IM chrome.exe:

(มันปิดโครเมี่ยมไม่มีข้อผิดพลาดของโครเมี่ยมเมื่อเปิดใหม่
แต่ข้อผิดพลาดใน cmd: "เป็นไปไม่ได้ที่จะยุติกระบวนการเด็ก (ประมาณ 4-5) โดยบังคับด้วย/F")


ฉันควรละเว้นข้อผิดพลาดของเด็ก cmd ถ้าเปิด Chrome อีกครั้ง ?


@MosheKatz: คุณช่วยแสดงตัวอย่างรหัสออกได้ไหม ฉันอยากจะรู้ว่าเกิดอะไรขึ้นเมื่อฉันกดปุ่ม X ..
neoDev

6
Taskkill ส่งข้อความ WM_CLOSE ไปยังโปรแกรมเป้าหมายเว้นแต่ระบุ / F (บังคับให้เลิกจ้าง) เพื่อให้โปรแกรมมีโอกาสล้างตัวเอง ทดสอบสิ่งนี้ด้วย Notepad - เปิด notepad แล้วพิมพ์บางอย่างที่นั่นแล้วป้อน "taskkill / im notepad.exe" คุณจะเห็นพรอมต์ให้บันทึกข้อมูล
Scott Rhee

@ScottRhee: ฉันพยายามเรียกใช้โดยไม่มี / F แต่ดูเหมือนจะปิดไม่ได้ ... ฉันผิดหรือเปล่า?
neoDev

@ScottRhee: ฉันก็ลองกับ Chrome ด้วย! บางครั้งเมื่อฉันเปิดใช้งานใหม่มันบอกว่า "คืนแท็บ" ในบรรทัดสีเหลืองภายใต้ URL ที่คล้ายกับนี้: backroom.bostonproductions.com/wp-content/uploads/2012/07/ …
neoDev

@Roger แปลกที่ฉันไม่ได้รับข้อความนั้นด้วย Taskkill / IM chrome.exe อย่างไรก็ตามฉันเชื่อว่าคุณทำในสิ่งที่ถูกต้อง ฉันเขียนคำตอบด้านล่างดังนั้นโปรดลองใช้แทน
Scott Rhee

คำตอบ:


43

วิธีที่เหมาะสมในการปิด / ออกโปรแกรมในท้ายที่สุดขึ้นอยู่กับซอฟต์แวร์ อย่างไรก็ตามโดยทั่วไปวิธีปฏิบัติที่ดีที่สุดคือให้โปรแกรม Windows ปิดเมื่อใดก็ตามที่พวกเขาได้รับข้อความ WM_CLOSE ปล่อยหน่วยความจำและด้ามจับปิดอย่างถูกต้อง มีข้อความอื่น ๆ ที่สามารถส่งสัญญาณการปิดแอปพลิเคชันได้ แต่ขึ้นอยู่กับผู้สร้างซอฟท์แวร์ว่ามีการจัดการแต่ละข้อความอย่างไร

taskkill /IM process.exe

taskkill ส่งข้อความ WM_CLOSE และขึ้นอยู่กับแอปพลิเคชันว่าจะปิดอย่างถูกต้องหรือไม่ คุณอาจต้องการใช้/Tตัวเลือกเพื่อส่งสัญญาณกระบวนการลูก

ใช้/Fตัวเลือกหากคุณต้องการบังคับให้ยกเลิกกระบวนการเท่านั้น

ตัวเลือกอื่น ๆ ได้แก่ การส่งปุ่ม Alt + F4 โดยใช้ PowerShell หรือแอปพลิเคชันบุคคลที่สาม

อัปเดตเป็นคำถามที่อัปเดต

ไม่สนใจข้อผิดพลาด Chrome สร้างกระบวนการมากมาย ข้อผิดพลาดเกิดขึ้นเมื่อกระบวนการไม่ยอมรับข้อความ WM_CLOSE ที่ TASKKILL ส่ง กระบวนการที่มีลูปข้อความเท่านั้นที่จะสามารถรับข้อความได้ดังนั้นกระบวนการที่ไม่มีลูปข้อความจะสร้างข้อผิดพลาดนั้น เป็นไปได้มากที่กระบวนการเหล่านี้เป็นส่วนขยายและปลั๊กอินของ Chrome

เพื่อซ่อนข้อผิดพลาดที่จับเอาท์พุท

taskkill /IM chrome.exe >nul

สรุป: TASKKILL เป็นวิธีที่เหมาะสมผ่านทางบรรทัดคำสั่งเพื่อการใช้งานอย่างใกล้ชิดต่อการดำเนินงานของ WM_CLOSE และไมโครซอฟท์ KB ที่ฉันเชื่อมโยง


ฉันอัปเดตคำถามของฉันโปรดดูได้ที่
neoDev

@Roger อัปเดตคำตอบของฉัน
David Ruhmann

มันหมายความว่าอะไร> nul?
neoDev

10
>เป็นตัวดำเนินการเปลี่ยนเส้นทางสำหรับ cmd.exe และnulเป็นโมฆะของพื้นที่ที่สิ่งต่าง ๆ ไม่เคยได้ยินอีกต่อไป
David Ruhmann

9

ลองNirCmd (ดาวน์โหลด: x86 x64 )

มันมีคำสั่ง "closeprocess" ซึ่งถูกออกแบบมาเพื่อปิดกระบวนการอย่างนุ่มนวล ตามเอกสารมันไม่ได้ยกเลิกแอพ แต่ส่งWM_CLOSEไปยังหน้าต่างระดับบนสุดทั้งหมดของกระบวนการเป้าหมาย

ตัวอย่างการใช้งาน:

nircmd ระบบปิด chrome.exe

หากวิธีนี้ใช้ไม่ได้ฉันเดิมพันว่าแอปพลิเคชันของคุณมีขั้นตอนการล้างข้อมูลที่ผิดปกติ ฉันต้องการดูว่าเกิดอะไรขึ้นภายในดังนั้นโปรดแจ้งให้เราทราบว่าแอปพลิเคชันเป้าหมายของคุณคืออะไร


ฉันอัปเดตคำถามของฉันโปรดดูได้ที่
neoDev

ฉันพบสิ่งนี้เพื่อให้ทำงานได้ดีขึ้น: nircmd win close title "My process title"
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?

คำตอบสำหรับคำถามนั้นสามารถพบได้here( ลิงค์ Microsoft )

คุณสามารถส่งWM_CLOSEข้อความไปที่หน้าต่างใด ๆ ที่คุณต้องการปิด มีหน้าต่างหลายบานWM_CLOSEที่พร้อมท์ให้ผู้ใช้บันทึกเอกสาร

@Killเครื่องมือที่ไม่ถูกต้องเป็น ดูSendMsgด้วย


ฉันไม่ทราบวิธีการทำในชุด แต่คุณสามารถใช้ vbscript นี้ การจำลองปุ่มAlt+ F4(เท่ากับสัญญาณWM_CLOSE)

เรียกใช้และดูลักษณะการทำงานของสคริปต์นี้ด้านล่าง

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 เป็นชื่อคีย์รายการสำหรับ SendKeys

เมื่อคุณเรียกใช้สคริปต์แผ่นจดบันทึกจะเปิดขึ้นมีการเขียนคำบางคำจากนั้นจะส่งสัญญาณเพื่อปิดโปรแกรมดูรูปด้านล่าง


คำถามเพิ่มเติม

ฉันสามารถเริ่มโปรแกรมให้ย่อเล็กสุดหรือพื้นหลังด้วย vbscript ได้หรือไม่?

ใช่. ใช้รหัสต่อไปนี้:

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

Run Methodสำหรับข้อมูลเพิ่มเติมการตรวจสอบ

โครเมี่ยมสามารถไปที่ URL ใน vbscript ได้ไหม?

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

หาก chrome เป็นค่าเริ่มต้นให้ใช้:

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

Source

มีวิธีนำโฟกัสไปที่แอปพลิเคชันเฉพาะ ( chrome.exe ) หรือไม่

Here ในตัวอย่าง

ฉันต้องการส่ง alt + f4 ให้กับ chrome เท่านั้นโดยไม่ขึ้นกับว่าฉันกำลังทำอะไรกับหน้าต่างอื่น

รหัสต่อไปนี้ทำงานบน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}"

ฉันสามารถเริ่มโปรแกรมให้ย่อเล็กสุดหรือพื้นหลังด้วย vbscript ได้หรือไม่?
neoDev

1
@Roger หากสนใจดูคำตอบของฉันที่นี่เกี่ยวกับวิธีการรวม Batch + JScript เป็นไฟล์เดียว JScript สามารถทำทุกอย่าง VBScript สามารถทำได้และในรูปแบบ C ที่มีโครงสร้างมากขึ้น
David Ruhmann

และโครเมี่ยมสามารถไปที่ url บางส่วนใน vbscript?
neoDev

มีวิธีนำโฟกัสไปที่แอปพลิเคชันเฉพาะ (chrome.exe) หรือไม่
neoDev

ใช่ฉันลองด้วย แต่ถ้าหลังจากการหน่วงเวลา (WScript.Sleep 5000) ฉันมี (WshShell.AppActivate "google chrome") ถ้าในระหว่างช่วงเวลานี้ฉันคลิกที่หน้าต่างอื่น Google Chrome จะไม่ปรากฏตัว ฉันสามารถเห็นโฟกัสของมันบนแถบเครื่องมือเท่านั้น ....
neoDev

3

มียูทิลิตีบรรทัดคำสั่งบางอย่างที่สามารถส่งWM_SYSCOMMANDข้อความที่เหมาะสม(พร้อมกับSC_CLOSEคำสั่ง) ไปยังหน้าต่างระดับบนสุดของโปรแกรม ฉันแน่ใจว่าอย่างน้อยหนึ่งจะกล่าวถึงในไม่ช้า (จากนั้นจะมีคนพูดถึง AutoIt จากนั้นจะมีคำตอบแสดงวิธีการใช้งานกับ PowerShell และCloseMainWindow())

ยูทิลิตีบรรทัดคำสั่งที่มาพร้อมกับคำสั่งในตัวในTCC ของ JP Softwareซึ่งเป็นตัวแปลคำสั่งและตัวประมวลผลคำสั่งสคริปต์สำหรับ Windows นั้นถูกเรียกTASKENDใช้


ฉันอัปเดตคำถามของฉันโปรดดูได้ที่
neoDev

2

ไม่เป็นไร ฉันเห็นสิ่งนี้ใน stackoverflow และคิดว่ามันเป็นคำถามที่ท้าทาย Soooo ฉันเพิ่งใช้เวลา 2 ชั่วโมงสุดท้ายในการเขียนโค้ด และนี่คือ ....

หลังจากทำตามขั้นตอนด้านล่างคุณสามารถพิมพ์ "TaskClose notepad.exe" หลังจากกดปุ่ม "Start" และจะบันทึกไฟล์แผ่นจดบันทึกที่ไม่มีเอกสารทั้งหมดลงในเดสก์ท็อปโดยอัตโนมัติ มันจะปิด chrome.exe อัตโนมัติและบันทึกการตั้งค่าการคืนค่า

คุณสามารถเพิ่มและลบการตั้งค่าเพิ่มเติมสำหรับแอปพลิเคชันอื่น ๆ ภายใต้เงื่อนไข if ตัวอย่างเช่น

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

vbs และแบตช์ไฟล์ดำเนินการตามขั้นตอนต่อไปนี้:

  • รวบรวมปฏิบัติการ
  • เคียวรีชื่อแอ็พพลิเคชันที่รันได้จากรายการงาน
  • ดำเนินการตามขั้นตอน "Alt + TAB (x)" จนกว่าจะยืนยันว่าหน้าต่างนั้นเปิดอยู่
  • จากนั้นเรียกใช้งานคำสั่งการหมุนไม่ว่าจะเป็น "Alt + F4" หรือแม้กระทั่งในกรณีที่รุนแรง
  • Alt + F4
  • เปิดใช้งานบันทึก
  • ชื่อไฟล์ AutoIncrememnt
  • ออกจากแอปพลิเคชัน

ReturnAppList.bat: ติดตั้งใน "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: \ windows \ system32 \" และ "C: \ Users \ YourUserName \"

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

TaskClose.vbs: ติดตั้งใน "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

มันสนุกมากที่จะเขียนและฉันมีความสุขมากกว่าที่จะเขียนให้จบมากกว่าการแสดงคำตอบ ขอให้มีความสุขในสัปดาห์นี้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.