Saya mencoba menggunakan logika validasi berikut dalam file batch tetapi blok "penggunaan" tidak pernah dijalankan bahkan ketika tidak ada parameter yang diberikan ke file batch.
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
Apa yang saya lakukan salah?
batch-file
arguments
Daniel Fortunov
sumber
sumber
Jawaban:
Pemeriksaan apakah argumen baris perintah telah disetel dapat dilakukan
[%1]==[]
, tetapi, seperti yang ditunjukkan Dave Costa , juga akan berfungsi."%1"==""
Saya juga memperbaiki kesalahan sintaks dalam penggunaan gema untuk menghindari tanda lebih besar dari dan kurang dari. Selain itu,
exit
kebutuhan/B
argumen jika tidakCMD.exe
akan berhenti.sumber
set
variabel (saya tidak tahu terminologi batch yang benar), Anda mungkin ingin menggunakan"%myvar%"==""
karena jikamyvar
memiliki spasi di dalamnya dan tidak dikutip, Anda akan mendapatkan "tidak terduga saat ini "pesan.IF NOT DEFINED VarName
blok. Juga +1 untuk tukushan karena tidak menggunakan tanda kutip sebagai perbandingan. Jangan lakukan itu. Tidak pernah."%~1"==""
juga akan bekerja dan menangani kasus di mana% 1 memiliki tanda kutip ganda"%~1"==""
menangani spasi dalam variabel sedangkan[]
versinya tidak.✨ hal lainnya..✨
■ di
%~1
-~
menghapus pembungkus"
atau'
.■ in
%~s1
- thes
makes the path beDOS 8.3 naming
, yang merupakan trik bagus untuk menghindari spasi dalam nama file saat memeriksa sesuatu (dan dengan cara ini tidak perlu membungkus sumber daya dengan lebih banyak"
s.■
["%~1"]==[""]
"tidak yakin" jika argumennya adalah file / direktori atau hanya string umum, jadi sebagai gantinya ekspresi menggunakan tanda kurung dan yang asli tidak dimodifikasi%1
(hanya tanpa"
pembungkus, jika ada ..)jika tidak ada argumen jika kita telah menggunakan
shift
dan pointer daftar- argumen telah melewati yang terakhir, ekspresi akan dievaluasi[""]==[""]
.■ ini sespesifik mungkin tanpa menggunakan lebih banyak trik (ini akan bekerja bahkan di skrip batch windows-95 ...)
■ Contoh pelaksanaan
simpan sebagai
identifier.cmd
ia dapat mengidentifikasi argumen tak terbatas (biasanya Anda dibatasi
%1
-%9
), ingatlah untuk membungkus argumen dengan koma terbalik, atau gunakan penamaan 8.3, atau seret & lepas (secara otomatis melakukan salah satu dari yang di atas).ini memungkinkan Anda untuk menjalankan perintah berikut:
⓵
identifier.cmd c:\windows
dan untuk mendapatkan⓶
identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
dan untuk mendapatkan⓷ dan banyak argumen (tentu saja ini kesepakatan keseluruhan ..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
dan untuk mendapatkan
tentu saja ini bisa jauh lebih kompleks, tetapi contoh yang bagus harus selalu sederhana dan minimal. :)
Semoga bisa membantu siapa saja :)
diterbitkan di sini: CMD Ninja - Pemrosesan Argumen Tidak Terbatas, Mengidentifikasi Jika Ada Dalam Sistem File, Mengidentifikasi Jika File Atau Direktori
dan berikut adalah contoh kerja yang mengambil sejumlah file APK (aplikasi Android) dan menginstalnya di perangkat Anda melalui debug-console (ADB.exe): Jadikan Posting Sebelumnya Penginstal APK Massal yang Tidak Menggunakan ADB Install-Multi Syntax
sumber
Singkirkan tanda kurung.
Contoh file batch:
Keluaran dari menjalankan skrip di atas:
Saya pikir sebenarnya mengambil tanda kurung untuk menjadi bagian dari string dan dibandingkan.
sumber
if "%1"==""
akan macet jika arg memiliki spasi. Sebagai contoh:run.bat "a b"
. @amr memiliki jawaban terbaik untuk digunakanif "%~1"==""
~ akan membatalkan kutipan% 1 jika% 1 itu sendiri dikutip.
"" akan melindungi dari karakter khusus yang lewat. misalnya memanggil skrip dengan & ping
sumber
run.bat "a b"
run.bat ""
tidak akan tertangkap oleh[%1]==[]
.sumber
run.bat "a b"
Ini sama dengan jawaban lainnya, tetapi hanya menggunakan satu label dan mengutamakan penggunaannya, yang juga menjadikannya sebagai semacam dokumentasi pujian dari skrip yang juga biasanya ditempatkan di bagian atas:
Namun, jika Anda tidak harus menggunakan cmd / batch, gunakan bash di WSL atau PowerShell, mereka memiliki sintaks yang lebih waras dan fitur yang lebih rahasia.
sumber
JIKA "% 1" == "" gagal, semua versi ini akan gagal dalam kondisi karakter racun tertentu. Hanya JIKA DITETAPKAN atau JIKA TIDAK DITETAPKAN aman
sumber
if [not] defined ...
tidak bekerja dengan parameter seperti%1
. Apakah Anda punya contoh, di manaif "%~1" ...
tidak berfungsi?