Bagaimana saya bisa memeriksa apakah sebuah argumen didefinisikan saat memulai / memanggil file batch?


97

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?



@ double-beep - Pertanyaan di sini (oleh daniel-fortunov) ditanyakan pertama kali, sekitar setahun sebelum pertanyaan yang Anda maksud diposting. Manakah duplikat (mungkin)?
Kevin Fegan

@KevinFegan karena pertanyaan lain memiliki lebih banyak tampilan dan lebih banyak jawaban.
bip ganda

Jawaban:


147

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, exitkebutuhan /Bargumen jika tidak CMD.exeakan berhenti.

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1

18
[% 1] == [] lebih baik daripada "% 1" == "" karena ini akan menangani kasus di mana% 1 itu sendiri berisi tanda kutip ganda dengan benar. "% 1" == "" akan error dengan pesan "tidak terduga saat ini".
tekumara

2
Perhatikan bahwa, jika Anda tidak menggunakan argumen baris perintah tetapi setvariabel (saya tidak tahu terminologi batch yang benar), Anda mungkin ingin menggunakan "%myvar%"==""karena jika myvarmemiliki spasi di dalamnya dan tidak dikutip, Anda akan mendapatkan "tidak terduga saat ini "pesan.
Tepuk

1
Variabel @Pat SET dapat diperiksa dengan IF NOT DEFINED VarNameblok. Juga +1 untuk tukushan karena tidak menggunakan tanda kutip sebagai perbandingan. Jangan lakukan itu. Tidak pernah.
Fr0sT

10
"%~1"==""juga akan bekerja dan menangani kasus di mana% 1 memiliki tanda kutip ganda
Drakkim

8
"%~1"==""menangani spasi dalam variabel sedangkan []versinya tidak.
Cookie Butter

17

Contoh yang lebih canggih:

⍟ argumen tak terbatas.

⍟ ada di sistem file (baik fileatau directory?) Atau generik string.

⍟ tentukan apakah itu file

⍟ tentukan adalah direktori

tidak ada ekstensi, akan berfungsi di skrip lama!

kode minimal ☺

@echo off

: loop
      :: -------------------------- berargumen?
      jika ["% ~ 1"] == [""] (
        gema selesai.
        kebagian akhir
      )
      :: -------------------------- ada argumen?
      jika tidak ada% ~ s1 (
        gema tidak ada
      ) lain (
        gema ada
        jika ada% ~ s1 \ NUL (
          echo adalah sebuah direktori
        ) lain (
          echo adalah sebuah file
        )
      )
      :: --------------------------
      bergeser
      goto loop
      
      
:akhir

berhenti sebentar

✨ hal lainnya..✨

■ di %~1- ~menghapus pembungkus "atau '.

■ in %~s1- the smakes the path be DOS 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 shiftdan 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

ada
adalah sebuah direktori
selesai

identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE" dan untuk mendapatkan

ada
adalah sebuah file
selesai

⓷ dan banyak argumen (tentu saja ini kesepakatan keseluruhan ..)

identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world

dan untuk mendapatkan

ada
adalah sebuah direktori
ada
adalah sebuah file
ada
adalah sebuah file
tidak ada
selesai.

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


14

Singkirkan tanda kurung.

Contoh file batch:

echo "%1"

if ("%1"=="") echo match1

if "%1"=="" echo match2

Keluaran dari menjalankan skrip di atas:

C:\>echo "" 
""

C:\>if ("" == "") echo match1 

C:\>if "" == "" echo match2 
match2

Saya pikir sebenarnya mengambil tanda kurung untuk menjadi bagian dari string dan dibandingkan.


1
if "%1"==""akan macet jika arg memiliki spasi. Sebagai contoh: run.bat "a b". @amr memiliki jawaban terbaik untuk digunakanif "%~1"==""
wisbucky

6
IF "%~1"=="" GOTO :Usage

~ akan membatalkan kutipan% 1 jika% 1 itu sendiri dikutip.

"" akan melindungi dari karakter khusus yang lewat. misalnya memanggil skrip dengan & ping


1
Ini jawaban terbaik. Jawaban lain berfungsi untuk beberapa kasus, tetapi akan gagal untuk kasus yang lebih khusus sepertirun.bat "a b"
wisbucky

@wisbucky Itu sepertinya tidak mengacaukan jawaban yang diterima . Apa yang saya lewatkan?
ruffin

@ruffin, Contoh: run.bat ""tidak akan tertangkap oleh [%1]==[].
wisbucky


2

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:

@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo       param%%1 the file to operate on
echo       param%%1 another file

:: --------------------------
exit /B 1

:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...

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.


0

JIKA "% 1" == "" gagal, semua versi ini akan gagal dalam kondisi karakter racun tertentu. Hanya JIKA DITETAPKAN atau JIKA TIDAK DITETAPKAN aman


if [not] defined ...tidak bekerja dengan parameter seperti %1. Apakah Anda punya contoh, di mana if "%~1" ...tidak berfungsi?
Stephan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.