ฆ่ากระบวนการบางอย่างด้วยชื่อไฟล์. exe


126

ฉันจะฆ่ากระบวนการที่ใช้งานอยู่โดยค้นหาชื่อไฟล์. exe ใน C # .NET หรือ C ++ ได้อย่างไร


2
หากคุณจำเป็นต้องฆ่ากระบวนการโดยบางส่วนเห็นชื่อstackoverflow.com/questions/14632162/...
Alexei Levenkov

คำตอบ:


243

คำตอบที่รวดเร็ว:

foreach (var process in Process.GetProcessesByName("whatever"))
{
    process.Kill();
}

(ออกจาก. exe จากชื่อกระบวนการ)


2
สิ่งที่ควรทำหากด้านบนส่งคืนรหัส Exception (กระบวนการ 32 บิตไม่สามารถเข้าถึงโมดูลของกระบวนการ 64 บิต)
Manish

40
ปิด ".exe" จาก MSDN: "ชื่อกระบวนการเป็นชื่อที่จำง่ายสำหรับกระบวนการเช่น Outlook ซึ่งไม่มีนามสกุล. exe หรือเส้นทาง"

1
@AgainMe Process.Kill () ส่งสัญญาณฆ่าไปยังโปรเซสซึ่งจะหยุดการดำเนินการไม่ว่าจะเกิดขึ้นที่ไหน ซึ่งแตกต่างจากสัญญาณขัดจังหวะตรงที่กระบวนการจะไม่มีโอกาสตอบสนองและ / หรือล้างออกจากสัญญาณ จะไม่มีการดำเนินการอีกต่อไปในกระบวนการนั้นและการล็อกทรัพยากรใด ๆ ที่ใช้โดยกระบวนการนั้นจะถูกปลดล็อก Environment.Exit () ดำเนินการโดยกระบวนการดำเนินการในปัจจุบันเพื่อฆ่าตัวเองด้วยรหัสความสำเร็จซึ่งปลอดภัยอย่างสมบูรณ์ Process.Kill () ไม่ปลอดภัยเท่ากับ Environment.Exit ()
jchitel

2
ฉันขอแนะนำให้ใช้ LINQ: var procs = Process.GetProcesses () โดยที่ (pr => pr.ProcessName.Contains ("Spotify"));
Leandro

2
ตัวเลือกใดในการฆ่าอินสแตนซ์ของกระบวนการหรือไม่ ฉันหมายถึงContains("Spotify"))ฆ่าอินสแตนซ์ทั้งหมดของSpotify. ฉันต้องการฆ่าอินสแตนซ์เฉพาะของSpotify.
Banee Ishaque K

38

วิธีแก้ปัญหาของฉันคือใช้Process.GetProcess ()เพื่อแสดงรายการกระบวนการทั้งหมด
ด้วยการกรองให้มีกระบวนการที่ฉันต้องการฉันจึงสามารถเรียกใช้เมธอดProcess.Kill ()เพื่อหยุดพวกเขา:

var chromeDriverProcesses = Process.GetProcesses().
    Where(pr => pr.ProcessName == "chromedriver"); // without '.exe'

foreach (var process in chromeDriverProcesses)
{
     process.Kill();
}

ปรับปรุง:

ในกรณีที่ต้องการใช้asyncวิธีการกับวิธีการล่าสุดที่เป็นประโยชน์จากC# 8( Async Enumerables ) ให้ตรวจสอบสิ่งนี้:

const string processName = "chromedriver"; // without '.exe'
await Process.GetProcesses()
             .Where(pr => pr.ProcessName == processName)
             .ToAsyncEnumerable()
             .ForEachAsync(p => p.Kill());

หมายเหตุ: การใช้asyncวิธีการไม่ได้หมายความว่าโค้ดจะทำงานได้เร็วขึ้นเสมอไป แต่อย่างน้อยก็จะไม่เสียเวลาของ CPU และจะป้องกันไม่ให้เธรดเบื้องหน้าหยุดทำงานขณะดำเนินการ ไม่ว่าในกรณีใดคุณต้องคิดว่าคุณอาจต้องการเวอร์ชันใด


คุณสามารถใช้มีแทนเท่ากับ
Leandro

10
เรื่องบังเอิญตลกคือฉันกำลังมองหาวิธีแก้ปัญหาในการฆ่าโครเมียมไดเวอร์ในหัวข้อนี้ ต้องเป็นเรื่องธรรมดา
kerl

เหมือนกันที่นี่ ดูเหมือนจะไม่สามารถแก้ปัญหาได้ คอนโซลเริ่มต้นที่ถูกไล่ออกเป็นอินสแตนซ์ของ chrome.exe และฉันเดาว่าคุณไม่ต้องการบังคับให้ปิดทั้งหมดเว้นแต่จะเป็นตัวแทนสร้าง / ทดสอบ
Dan Csharpster

16

คุณสามารถใช้Process.GetProcesses()เพื่อรับกระบวนการที่กำลังทำงานอยู่จากนั้นProcess.Kill()เพื่อฆ่ากระบวนการ


6
Process.GetProcessesByName จะทำให้สิ่งนี้ง่ายขึ้น
ConsultUtah

สิ่งที่ควรทำหากด้านบนส่งคืนรหัส Exception (กระบวนการ 32 บิตไม่สามารถเข้าถึงโมดูลของกระบวนการ 64 บิต)
Manish

0

หากคุณมี ID กระบวนการ ( PID) คุณสามารถฆ่ากระบวนการนี้ได้ดังนี้:

Process processToKill = Process.GetProcessById(pid);
processToKill.Kill();

0

คุณสามารถฆ่าอินสแตนซ์เฉพาะของ MS Word ได้

foreach (var process in Process.GetProcessesByName("WINWORD"))
{
    // Temp is a document which you need to kill.
    if (process.MainWindowTitle.Contains("Temp")) 
        process.Kill();
}

-2
public void EndTask(string taskname)
{
      string processName = taskname.Replace(".exe", "");

      foreach (Process process in Process.GetProcessesByName(processName))
      {
          process.Kill();
      }
}

//EndTask("notepad");

สรุป : ไม่ว่าชื่อจะมี. exe กระบวนการจะสิ้นสุดลง คุณไม่จำเป็นต้อง "ออกจาก. exe จากชื่อกระบวนการ" มันทำงานได้ 100%


1
ที่เรียบง่าย.Replace(".exe", "")อยู่ด้านบนได้รับการโหวตคำตอบที่จะทำเช่นนี้ด้วยรหัสที่ซับซ้อนมากน้อยและไม่จำเป็น
AndrewK

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