Jawaban singkatnya - gunakan tanda kurung siku:
if [%1]==[] goto :blank
atau (ketika Anda perlu menangani argumen yang dikutip, lihat Edit di bawah):
if [%~1]==[] goto :blank
Mengapa? Anda mungkin bertanya. Nah, seperti yang dikatakan Jeremiah Willcock: http://ss64.com/nt/if.html - mereka menggunakannya! Oke, tapi apa yang salah dengan kutipannya?
Sekali lagi, jawaban singkatnya: kutipan itu "ajaib" - terkadang tanda kutip ganda (ganda) diubah menjadi tanda kutip tunggal (ganda). Dan mereka harus cocok, sebagai permulaan.
Pertimbangkan skrip kecil ini:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
Mari kita uji:
C:\> argq bla bla
bla
bla
Done.
Sepertinya berhasil. Tapi sekarang, mari beralih ke gigi kedua:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boom Ini tidak bernilai benar, juga tidak bernilai salah. Script MATI. Jika Anda seharusnya mematikan reaktor di suatu tempat, ya - sial. Anda sekarang akan mati seperti Harry Daghlian.
Anda mungkin berpikir - Oke, argumen tidak boleh berisi tanda kutip. Jika mereka melakukannya, ini terjadi. Salah Ini beberapa penghiburan:
C:\> argq ""bla bla""
""bla
bla""
Done.
Oh ya. Jangan khawatir - terkadang ini akan berhasil.
Mari coba skrip lain:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
Anda dapat menguji sendiri, apakah itu berfungsi dengan baik untuk kasus di atas. Ini logis - tanda kutip tidak ada hubungannya dengan tanda kurung, jadi tidak ada keajaiban di sini. Tapi bagaimana dengan membumbui args dengan tanda kurung?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
Tidak beruntung disana. Tanda kurung tidak bisa mencekik cmd.exe
parser.
Mari kita kembali ke kutipan jahat sejenak. Masalahnya ada di sana, ketika argumen diakhiri dengan kutipan:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
Bagaimana jika saya lulus hanya:
D:\>argq bla2"
The syntax of the command is incorrect.
Skrip tidak akan berjalan sama sekali. Sama untuk args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Tapi apa yang saya dapatkan, ketika jumlah "
-karakter "cocok" (yaitu - genap), dalam kasus seperti itu:
D:\>args bla2" "bla3
bla2" "bla3
Done.
BAGUS - Saya harap Anda mempelajari sesuatu tentang bagaimana .bat
file membagi argumen baris perintah mereka (PETUNJUK: * Ini tidak persis seperti di bash). Argumen di atas mengandung spasi. Tetapi tanda kutip tidak dihapus secara otomatis.
Dan argq? Bagaimana reaksinya terhadap itu? Dapat diprediksi:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Jadi - pikirkan sebelum Anda mengatakan: "Tahu apa? Gunakan saja tanda kutip. [Karena, bagi saya, ini terlihat lebih bagus]".
Edit
Baru-baru ini, ada komentar tentang jawaban ini - yah, tanda kurung siku "tidak dapat menangani" melewati argumen yang dikutip dan memperlakukannya seolah-olah tidak dikutip.
Sintaksnya:
if "%~1"=="" (...)
Bukan beberapa keunggulan yang baru ditemukan dari tanda kutip ganda, tetapi tampilan fitur rapi dari tanda kutip dari variabel argumen, jika karakter pertama dan terakhir adalah tanda kutip ganda.
"Teknologi" ini bekerja dengan baik dengan tanda kurung siku:
if [%~1]==[] (...)
Ini adalah hal yang berguna untuk menunjukkan hal ini, jadi saya juga mendukung jawaban baru tersebut.
Terakhir, penggemar kutipan ganda, apakah argumen formulir tersebut ""
ada di buku Anda, atau kosong? Hanya askin ';)
GOTO BLANK
baris) ke duaIF
pernyataan lainnya, apakah itu memperbaiki masalah?