ตรวจจับกระบวนการที่กำลังทำงานโดยมีช่องว่างในชื่อไฟล์


1

ฉันพยายามตรวจสอบกระบวนการทำงานบน Windows 7 โดยใช้ไฟล์แบตช์ กระบวนการที่ไม่มีช่องว่างสามารถใช้งานได้ดีเช่น notepad.exe ฉันไม่เข้าใจว่าทำไมมันไม่ทำงานและจะขอบคุณความช่วยเหลือใด ๆ

รหัส

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set "EXE=My Process.exe"

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto ProcessFound 

goto ProcessNotFound

:ProcessFound
echo 1
goto END

:ProcessNotFound
echo 0
goto END

:END

ผลที่คาดหวัง

C:\test.bat
1

ผลลัพธ์ที่แท้จริง

C:\test.bat
'Process.exe' is not recognized as an internal or external command,
operable program or batch file.
0

ไวยากรณ์ของคุณผิด set EXE="My Process.exe"จะเป็นที่ยอมรับ
Ramhound

set EXE = "My Process.exe" ไม่ทำงานเช่นกัน ข้อผิดพลาดที่ส่งคืนคือตอนนี้: - ข้อผิดพลาด: อาร์กิวเมนต์ / ตัวเลือกไม่ถูกต้อง - 'Process.exe'
Reado

คำตอบ:


1

มีปัญหาหนึ่งที่สำคัญกับรหัสของคุณและไม่มีอะไรเกี่ยวข้องกับช่องว่างในชื่อกระบวนการ

เมื่อคุณเรียกใช้tasklist /NHแต่ละบรรทัดที่ส่งคืนเป็นมากกว่าชื่อกระบวนการ:

C:\temp>tasklist /nh

System Idle Process              0 Services                   0         24 K
System                           4 Services                   0      2,200 K
smss.exe                       400 Services                   0      1,232 K

ดังนั้นคุณพยายามที่จะรับสายเช่น:

System Idle Process 0 Services 0 24 K(ซึ่งเป็นสิ่งที่%%xจะถือ) และดูว่ามันเท่ากับชื่อกระบวนการให้ (เช่น: System Idle Process)

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

นอกจากนี้:

set "EXE=My Process.exe"ไม่ต้องการคำพูด มันรู้ว่าทุกอย่างในบรรทัดหลังจากเครื่องหมายเท่ากับคือค่าที่กำหนดให้กับตัวแปรที่ตั้งชื่อทางด้านซ้าย ดังนั้นset EXE=My Process.exeจะทำงานได้ดีแม้มีช่องว่าง

การใส่เครื่องหมายคำพูดรอบส่วนของค่า (ตามที่แนะนำในความคิดเห็น) เป็นวิธีปกติในการกำหนดสตริง แต่เนื่องจาก Set ไม่ได้อิงตามประเภท (มันไม่รู้จักสตริงจากตัวเลขจากรูปสามเหลี่ยม ฯลฯ ) จึงจะรวม คำพูด ดังนั้นset Filename="My Name"หมายความว่าตอนนี้ค่าของชื่อไฟล์"My Name"รวมถึงเครื่องหมายคำพูดแล้ว สิ่งนี้อาจทำให้สับสน / ทำลายสิ่งต่าง ๆ เมื่อพยายามใช้ในภายหลัง (ระหว่างเครื่องหมายคำพูดอื่นในคำสั่งอื่น ฯลฯ )


1
ฉันแนะนำสตริงเท่านั้นเพราะสคริปต์แบทช์ของฉันไม่ได้มี แต่ยังไม่มีช่องว่าง แต่คุณพูดถูก
Ramhound

@Ramhound สุจริตการตัดค่าในเครื่องหมายคำพูดเป็นความคิดแรกของฉันเช่นกันฉันต้องใช้ชุดทดสอบสองสามครั้งจนกว่าความทรงจำจะกลับมาเพื่อเตือนฉันว่ามันเก็บราคาไว้ :)
Ƭᴇcʜιᴇ007

ประการแรกมันไม่ใช่รหัสของฉัน ฉันเป็นสามเณรที่สมบูรณ์เมื่อพูดถึงภาษาแบบนี้ ฉันแนะนำให้คุณทำ การใช้EXE=My Process.exeผลลัพธ์ยังคงมีข้อผิดพลาดเดียวกัน กำลังพยายามเรียกใช้ "Process.exe" เป็นคำสั่ง ทำไมถึงเป็นอย่างนั้น?
Reado

0

ฉันพบรหัสที่แตกต่างกันซึ่งทำงาน:

@echo off
tasklist /nh /fi "imagename eq My Process.exe" | find /i "My Process.exe" >nul && (
echo 1
) || (
echo 0
)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.