Saya mencari cara sederhana untuk menguji apakah ada yang dapat dieksekusi di variabel lingkungan PATH dari file batch Windows.
Penggunaan alat eksternal yang tidak disediakan oleh OS tidak diperbolehkan. Versi Windows minimal yang dibutuhkan adalah Windows XP.
Jawaban:
Jika Anda memerlukan ini untuk ekstensi yang berbeda, cukup ulangi
PATHEXT
:Mungkin itu
where
juga sudah ada di versi Windows lama, tetapi saya tidak memiliki akses ke salah satunya, jadi saya tidak tahu. Di mesin saya hal berikut juga berfungsi:dan kembali dengan kode keluar bukan nol jika tidak dapat ditemukan. Namun, dalam batch, Anda mungkin juga ingin mengalihkan output ke
NUL
.Mengingat
Parsing dalam
.bat
file batch ( ) dan pada baris perintah berbeda (karena file batch memiliki%0
-%9
), jadi Anda harus menggandakannya%
. Pada baris perintah ini tidak perlu, jadi untuk variabel hanya%X
.sumber
where myExecutable
.%0
-%9
), jadi Anda harus menggandakannya%
. Pada baris perintah ini tidak perlu, jadifor
variabelnya adil%x
.Windows Vista dan versi yang lebih baru dikirimkan dengan program yang disebut
where.exe
yang mencari program di jalur. Ini bekerja seperti ini:Untuk digunakan dalam file batch Anda dapat menggunakan
/q
sakelar, yang hanya mengaturERRORLEVEL
dan tidak menghasilkan output apa pun.Atau versi singkat sederhana (tapi kurang terbaca) yang mencetak pesan dan keluar dari aplikasi Anda:
sumber
Berikut adalah solusi sederhana yang mencoba menjalankan aplikasi dan menangani kesalahan apa pun sesudahnya .
Kode kesalahan 9009 biasanya berarti file tidak ditemukan.
Satu-satunya downside adalah yang
file.exe
benar-benar dieksekusi jika ditemukan (yang dalam beberapa kasus tidak dapat diterima).sumber
Ini dapat dilakukan melalui substitusi parameter.
Ini mengembalikan jalur lengkap dari nama file yang dapat dieksekusi di% 1, jika tidak string kosong.
Ini tidak berfungsi dengan variabel buatan pengguna. Jadi jika nama file yang dapat dieksekusi bukan merupakan parameter untuk skrip Anda, maka Anda memerlukan subrutin. Sebagai contoh:
Lihat http://ss64.com/nt/syntax-args.html
sumber
setlocal
tetapifor %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
merupakan salah satu solusi sejalan denganfor
digunakan sebagai solusi untuk%%~$PATH:X
untuk menghindaricall
dan%~$PATH:1
.sumber
for
tidak cukup pintar untuk mengurai kontenPATH
. Ini akan kehilangan direktori dengan spasi, misalnya. Dan bahkan ketika Anda menggunakanfor /f
dengandelims=;
itu tidak akan bekerja dengan benar jika direktori berisi;
dan dikutip.;
dengan"; "
:set quotedPath="%PATH:;="; "%"
."C:\Folder with; semicolon, quoted"
ke jalur dan lihat apa yang terjadi. Setidaknya di sini ia mencoba memperlakukan setiap »kata« secara terpisah yang, di satu sisi, lebih buruk daripada perilaku sebelumnya.Terkadang solusi sederhana ini berfungsi, di mana Anda memeriksa untuk melihat apakah hasilnya cocok dengan yang Anda harapkan. Baris pertama menjalankan perintah dan mengambil baris terakhir dari keluaran standar.
sumber
Jika Anda mencari sesuatu seperti saya di folder startup, harus pergi folder. Misalnya saya mencari exe di folder startup dan saya menggunakan kode ini seperti
sumber
program.exe
ada, tidak hanya dalam satu folderGunakan perintah: PowerShell Test-Path "exe yang Anda cari"
Ini akan mengembalikan True jika ada, jika tidak Salah.
sumber
Test-Path
hanya memeriksa jalur yang ditentukan, yaituTest-Path nuget.exe
akan mengembalikan nilai true hanya jikanuget.exe
ada di direktori saat ini. Jika nuget.exe tidak ada di direktori saat ini, ia akan mengembalikan false, meskipun ada di direktori yang terdaftar di variabel PATH. Di PowerShellGet-Command
mungkin bekerja lebih baik ( stackoverflow.com/questions/11242368/… ), tetapi pertimbangkan bahwa untuk PowerShell direktori saat ini tidak berada di jalur.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
akan mengembalikan nilai true jika ditemukan lokal atau di jalur.Bagi mereka yang mencari opsi PowerShell. Anda dapat menggunakan
Get-Command
cmdlet dengan melewatkan dua item. Pertama berikan lokasi dir saat ini dengan.\
awalan, lalu berikan nama exe saja.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
Itu akan mengembalikan nilai true jika ditemukan lokal atau di jalur lebar sistem.
sumber