พิจารณาว่าคำสั่งได้รับการยอมรับในไฟล์แบตช์


43

ฉันกำลังเขียนสคริปต์ค้างคาวที่ฉันเรียกใช้โปรแกรม (เช่น javac) เพื่อความง่ายฉันต้องการตรวจสอบว่ามีคำสั่งอยู่ก่อนที่จะรันหรือไม่ ie ถ้าคำสั่งอยู่ใน PATH

ตัวอย่างเช่น,

if (my_command.exe is a recognized command) then (
  my_command.exe my_args
) else (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file."
  REM Do not run my_command.exe
)

วิธีที่ดีที่สุดในการทำเช่นนี้ใน Windows คืออะไร


คุณจะ "จำ" คำสั่งของคุณได้อย่างไร?
โกง

ใน MS-DOS (DOS จริง) นี่ค่อนข้างง่าย คุณเพิ่งตรวจสอบการมีอยู่ของไฟล์ exe ใน c: \ dos; แต่ถึงอย่างนั้นคำถามก็ยังคงอยู่
โกง

ขอโทษสำหรับความสับสน. ฉันหมายถึงพร้อมรับคำสั่งใน Windows หากฉันพิมพ์ "lkajsflksajdfj" ฉันต้องการตรวจสอบว่าไม่ใช่คำสั่ง ถ้าฉันพิมพ์ "notepad.exe" ก็โอเค
user46097

คำตอบ:


54
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 

10
ถ้ามีคนไม่ต้องการส่งออกภายในหน้าต่าง cmd เพียงแค่เพิ่มที่อยู่เบื้องหลัง>nul 2>nul mycommand
เซบาสเตียน

โปรดทราบว่ามีช่องสัญญาณเอาต์พุตมากกว่า 1 และ 2 เนื่องจาก 1 หมายถึงเอาต์พุตบัฟเฟอร์และ 2 สำหรับข้อผิดพลาดบัฟเฟอร์ขึ้นอยู่กับวิธีการพัฒนาแอปพลิเคชันมันควรทำงานกับแอพทั่วไปที่มาพร้อมกับ Windows แต่โปรแกรม CLI เฉพาะสามารถ ยังคงขว้างข้อความเมื่อมีการเปลี่ยนเส้นทางช่อง 1 และ 2
ElektroStudios

15

โค้ดด้านล่างนี้ควรเรียกใช้งานอย่างหมดจดโดยไม่มีการทิ้งขยะ

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail
)

เอาท์พุท:

found javac

รหัสเดียวกับซับใน:

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )

เอาท์พุท:

fail

โปรดทราบว่าคำสั่งของ&&และ||ดูเหมือนว่าจะมีความสำคัญ นอกจากนี้คำสั่งที่มีอยู่ที่คุณกำลังทดสอบความต้องการที่จะกลับมาพร้อมกับ errorlevel <= 0 สำหรับสิ่งนี้ในการทำงาน หวังว่าคำสั่งจะมี /? หรือ - ช่วยอาร์กิวเมนต์หรือเช่นเดียวกับ java คำสั่งข้อมูลรุ่น


โซลูชั่นนี้สมบูรณ์แบบ!
robe007

7

วิธีที่ง่ายที่สุดคือการรันคำสั่ง แต่มีปัญหาอื่น ๆ แน่นอนเนื่องจากบางทีคุณอาจไม่ต้องการเริ่มกระบวนการสุ่ม

for %%x in (my_command.exe) do if not [%%~$PATH:x]==[] set MyCommandFound=1

เป็นทางเลือกที่ค้นหาโปรแกรมในพา ธ ที่แสดงรายการโดย%PATH%ตัวแปรสภาพแวดล้อม which(1)มันเป็นหลักรุ่นชุดบริสุทธิ์ มันสามารถทำให้ดีขึ้นได้ แต่ที่สำคัญคือมัน


1
นี่คือสิ่งที่สมบูรณ์แบบทำในสิ่งที่ต้องการ!
Pez Cuckow

3

สำหรับสถานการณ์ของฉัน วิธีที่ง่ายที่สุดคือการใช้ || หรือ && ผู้ประกอบการ

my_command.exe -version 2>NUL && echo "my_command exists"

หรือ

my_command.exe -version 2>NUL || echo "my_command doesn't exist"

ทำไมคุณไม่เปลี่ยนเส้นทาง stdout ด้วยล่ะ
Joey

3

การปรับแต่งบางอย่างให้เป็นเวอร์ชั่นด้านล่าง ทดสอบคำสั่งนั้นมีอยู่และระงับเอาต์พุตที่ไม่จำเป็น

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found

โดยที่ <my_exe> NUL 2> & 1 || echo my.exe ไม่มีอยู่ && goto: EOF ทำงานได้เป็นอย่างดีในสคริปต์
Robert

หมายเหตุ: มันไม่ทำงานหากชื่อไฟล์ที่คุณต้องการทดสอบรวมถึงข้อมูลเส้นทาง เช่น, WHERE \Windows\System32\cmd.exe=>INFO: Could not find files for the given pattern(s).
Jonathan Gilbert

1

หากต้องการการติดตั้งเครื่องมือพิเศษก็โอเคมีwhereคำสั่งในชุดทรัพยากร เห็นWindows เทียบเท่าที่ไหน? .

มิฉะนั้นสำหรับรุ่นของ Windows ที่ไม่โบราณเกินไปก็เป็นไปได้ในที่บริสุทธิ์cmdเป็นที่กล่าวถึงในการค้นหาปฏิบัติการ Dos ยกเว้นเส้นทาง


ขอบคุณสำหรับการตอบกลับ! น่าเสียดายที่ข้อกำหนดหนึ่งข้อหนึ่งคือต้องทำงานบนกล่องวานิลลา (รวมเครื่อง XP) ด้วยเหตุนี้จึงไม่มีตัวเลือก
user46097

2
ลิงค์ที่สองที่ Gilles มอบให้มีทางออกที่ดีที่ใช้สำหรับและไม่มีเครื่องมือพิเศษ
Paradroid

1

ฉันรู้ว่านี่ไม่ใช่สิ่งที่คุณกำลังมองหา แต่ด้วยการเปลี่ยนแปลงเล็กน้อยในตรรกะมันควรจะบรรลุสิ่งที่คุณต้องการ

ทุกคำสั่งที่รันมีโค้ดส่งคืน (aka errorlevel) หากโค้ดส่งคืนเป็น 0 (ศูนย์) คำสั่งจะทำงานได้สำเร็จหากรหัสส่งคืนมีค่ามากกว่า 0 แสดงว่ามีบางอย่างผิดปกติ

ดูที่นี่สำหรับรายละเอียดเพิ่มเติม

สิ่งที่ต้องการ -

my_command
if (%ERRORLEVEL% > 0) then (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file.  OR SOMETHING WENT WRONG WITH IT."
  REM Do not run my_command.exe
)

นี่มันฉลาดฉันชอบมัน
Shinrai

ใช่ แต่มันน่าเกลียดตั้งแต่ถ้าไม่พบคำสั่งมันจะพ่นข้อผิดพลาด 2 บรรทัด ดังนั้นอาจพบวิธีแก้ปัญหาที่สะอาดกว่า
djangofan

0

ในขณะที่วิธีการเหล่านั้นทั้งหมดอาจทำงานทำไมไม่สร้างในทาง?

If exists my_command do echo "my_command exists"

เรียกใช้ "if /?" บนบรรทัดคำสั่งเพื่อดูรายละเอียด


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