ฉันกำลังมองหาวิธีง่ายๆในการทดสอบว่าไฟล์ปฏิบัติการมีอยู่ในตัวแปรสภาพแวดล้อม PATH จากไฟล์แบตช์ของ Windows หรือไม่
ไม่อนุญาตให้ใช้เครื่องมือภายนอกที่ OS ไม่ได้จัดเตรียมไว้ให้ Windows เวอร์ชันขั้นต่ำที่จำเป็นคือ Windows XP
ฉันกำลังมองหาวิธีง่ายๆในการทดสอบว่าไฟล์ปฏิบัติการมีอยู่ในตัวแปรสภาพแวดล้อม PATH จากไฟล์แบตช์ของ Windows หรือไม่
ไม่อนุญาตให้ใช้เครื่องมือภายนอกที่ OS ไม่ได้จัดเตรียมไว้ให้ Windows เวอร์ชันขั้นต่ำที่จำเป็นคือ Windows XP
คำตอบ:
for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
if defined FOUND ...
หากคุณต้องการสิ่งนี้สำหรับส่วนขยายที่แตกต่างกันให้ทำซ้ำPATHEXT
:
set FOUND=
for %%e in (%PATHEXT%) do (
for %%X in (myExecutable%%e) do (
if not defined FOUND (
set FOUND=%%~$PATH:X
)
)
)
อาจเป็นไปได้ว่าwhere
มีอยู่แล้วใน Windows รุ่นเก่า แต่ฉันไม่สามารถเข้าถึงได้ดังนั้นฉันจึงไม่สามารถบอกได้ ในเครื่องของฉันสิ่งต่อไปนี้ยังใช้งานได้:
where myExecutable
และส่งคืนด้วยรหัสทางออกที่ไม่ใช่ศูนย์หากไม่พบ ในชุดงานคุณอาจต้องการเปลี่ยนเส้นทางเอาต์พุตไปยังNUL
ด้วย
โปรดทราบ
แยกในชุด ( .bat
) ไฟล์และแตกต่างบรรทัดคำสั่ง (เพราะมีไฟล์ batch %0
- %9
) ดังนั้นคุณต้องไปคู่%
มี %X
ในบรรทัดคำสั่งนี้ไม่จำเป็นดังนั้นสำหรับตัวแปรที่เป็นเพียง
where myExecutable
เสมอ
%0
- %9
) ดังนั้นคุณต้องไปคู่%
มี ในบรรทัดคำสั่งนี้ไม่จำเป็นดังนั้นตัวแปรที่เป็นเพียงfor
%x
Windows Vista และเวอร์ชันที่ใหม่กว่ามาพร้อมกับโปรแกรมที่เรียกwhere.exe
ว่าค้นหาโปรแกรมในเส้นทาง มันทำงานดังนี้:
D:\>where notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
D:\>where where
C:\Windows\System32\where.exe
สำหรับการใช้งานในไฟล์แบตช์คุณสามารถใช้/q
สวิตช์ซึ่งเพิ่งตั้งค่าERRORLEVEL
และไม่ได้สร้างเอาต์พุตใด ๆ
where /q myapplication
IF ERRORLEVEL 1 (
ECHO The application is missing. Ensure it is installed and placed in your PATH.
EXIT /B
) ELSE (
ECHO Application exists. Let's go!
)
หรือเวอร์ชันชวเลขง่าย ๆ (แต่อ่านได้น้อยกว่า) ที่พิมพ์ข้อความและออกจากแอปของคุณ:
where /q myapplication || ECHO Cound not find app. && EXIT /B
นี่คือวิธีที่ง่ายที่ความพยายามที่จะเรียกใช้โปรแกรมประยุกต์และจัดการข้อผิดพลาดใด ๆในภายหลัง
file.exe /? 2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path
รหัสข้อผิดพลาด 9009 มักจะหมายถึงไม่พบไฟล์
ข้อเสียเพียงอย่างเดียวคือfile.exe
จะถูกดำเนินการจริงหากพบ (ซึ่งในบางกรณีไม่สมควร)
สิ่งนี้สามารถทำได้โดยการทดแทนพารามิเตอร์
%~$PATH:1
สิ่งนี้ส่งคืนเส้นทางแบบเต็มของชื่อไฟล์ปฏิบัติการใน% 1 ไม่เช่นนั้นจะเป็นสตริงว่าง
สิ่งนี้ใช้ไม่ได้กับตัวแปรที่ผู้ใช้กำหนดเอง ดังนั้นหากชื่อไฟล์ที่เรียกใช้งานได้ไม่ใช่พารามิเตอร์สำหรับสคริปต์ของคุณคุณต้องมีรูทีนย่อย ตัวอย่างเช่น:
call :s_which app.exe
if not "%_path%" == "" (
"%_path%"
)
goto :eof
:s_which
setlocal
endlocal & set _path=%~$PATH:1
goto :eof
setlocal
แต่for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
เป็นวิธีการแก้บรรทัดเดียวกับfor
ที่ใช้เป็นวิธีแก้ปัญหาสำหรับ%%~$PATH:X
ในการสั่งซื้อเพื่อหลีกเลี่ยงและcall
%~$PATH:1
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
for
ไม่ฉลาดพอที่จะแยกวิเคราะห์เนื้อหาของไฟล์PATH
. มันจะพลาดไดเรกทอรีที่มีช่องว่างเช่น และแม้ว่าคุณจะใช้for /f
กับdelims=;
มันจะทำงานไม่ถูกต้องหากไดเร็กทอรีมี a ;
และถูกยกมา
;
ด้วย"; "
: set quotedPath="%PATH:;="; "%"
.
"C:\Folder with; semicolon, quoted"
เส้นทางและดูว่าเกิดอะไรขึ้น อย่างน้อยก็ลองปฏิบัติต่อ»ทุกคำ«แยกกันซึ่งในทางหนึ่งมันแย่กว่าพฤติกรรมก่อนหน้านี้
บางครั้งวิธีง่ายๆนี้ก็ใช้ได้ผลโดยที่คุณตรวจสอบว่าผลลัพธ์ตรงกับที่คุณคาดหวัง บรรทัดแรกรันคำสั่งและคว้าบรรทัดสุดท้ายของเอาต์พุตมาตรฐาน
FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
หากคุณกำลังค้นหาบางอย่างเช่นฉันในโฟลเดอร์เริ่มต้นควรไปที่โฟลเดอร์ ตัวอย่างเช่นฉันค้นหา exe ในโฟลเดอร์เริ่มต้นและฉันใช้รหัสนี้เช่น
@echo off
cd C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
where /q program.exe
IF ERRORLEVEL 1 (
echo F | xcopy /Y /S /I /E "\\programsetup\programsetup.exe"
"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\program.exe"
) ELSE (
ECHO Application exists. Let's go!
)
program.exe
มีอยู่ไม่ใช่เฉพาะในโฟลเดอร์เดียว
ใช้คำสั่ง: powershell Test-Path "exe ที่คุณกำลังมองหา"
มันจะคืนค่า True ถ้าเป็นปัจจุบันมิฉะนั้น False
Test-Path
ตรวจสอบเส้นทางที่ระบุเท่านั้นกล่าวคือTest-Path nuget.exe
จะคืนค่าจริงก็ต่อเมื่อnuget.exe
อยู่ในไดเร็กทอรีปัจจุบัน หาก nuget.exe ไม่อยู่ในไดเร็กทอรีปัจจุบันจะส่งคืนเท็จแม้ว่าจะอยู่ในไดเร็กทอรีที่แสดงในตัวแปร PATH ก็ตาม ใน PowerShell Get-Command
อาจทำงานได้ดีขึ้น ( stackoverflow.com/questions/11242368/… ) แต่โปรดคำนึงว่าสำหรับ PowerShell ไดเรกทอรีปัจจุบันไม่อยู่ในเส้นทาง
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
จะคืนค่าจริงหากพบในพื้นที่หรือในเส้นทาง
สำหรับผู้ที่มองหาตัวเลือก PowerShell คุณสามารถใช้Get-Command
cmdlet ผ่านสองรายการ ก่อนอื่นให้ระบุตำแหน่ง dir ปัจจุบันพร้อม.\
คำนำหน้าจากนั้นให้ชื่อ exe
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
ซึ่งจะส่งคืนเป็นจริงหากพบในระบบหรือในเส้นทางกว้าง