Saya perlu menguji apakah suatu variabel disetel atau tidak. Saya sudah mencoba beberapa teknik tetapi mereka tampaknya gagal setiap kali %1
dikelilingi oleh tanda kutip seperti kasus ketika %1
adalah "c:\some path with spaces"
.
IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.
Menurut situs ini , ini adalah IF
jenis sintaks yang didukung . Jadi, saya tidak melihat cara untuk melakukannya.
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
windows
shell
batch-file
cmd
blak3r
sumber
sumber
if "%1" == "" GOTO MyLabel
tidak mematikan eksekusi skrip selama%1
memiliki jumlah genap dari tanda kutip ganda. Saya melihat bahwa jumlah ganjil dari tanda kutip ganda dalam%1
membunuh eksekusi skrip dengan kesalahan ini:The syntax of the command is incorrect.
Solusi di bawah ini yang menggunakan tanda kurung siku untuk menyelesaikan masalah telah ditandai sebagai jawaban yang benar tetapi sepertinya tidak ada yang lebih baik . Solusi itu juga gagal dengan kesalahan yang sama ketika%1
memiliki jumlah tanda kutip ganda ganjil.IF DEFINED
hanya mengerjakan variabel lingkungan dan bukan variabel skrip adalah pemborosan!Jawaban:
Gunakan tanda kurung kotak alih-alih tanda kutip:
Kurung tidak aman : hanya gunakan kurung kotak.
sumber
&
in%1
akan memutus garisif #%1#==##
atauif [%1]==[]
baik selama tidak ada spasi dalam argumen, jika tidak, Anda akan mendapatkan…was unexpected at this time
kesalahan."%~1"
benar-benar pendekatan yang lebih baik, seperti yang saya sebutkan dalam jawaban saya.==
. Gunakan jawabannya sebagai gantinya.it DOES NOT work with spaces
. Gunakan jawaban @jamesdlin sebagai gantinya.Kamu bisa memakai:
untuk menghapus set kutipan. Secara umum, ini adalah metode yang lebih andal daripada menggunakan tanda kurung siku karena itu akan bekerja bahkan jika variabel memiliki spasi di dalamnya.
sumber
~
, Anda menghapus tanda kutip luar jika ada, tetapi kemudian menambahkannya kembali secara manual (memastikan hanya satu set). Selain itu, Anda harus menggunakan tanda kutip jika argumen berisi spasi (saya belajar ini dengan cara yang sulit ketika versi saya sebelumnya menggunakan#
atau tanda kurung alih-alih tanda kutip menyebabkan argumen dengan spasi untuk membuat…was unexpected at this time
kesalahan.)""this string will crash the comparison""
. Dobel '"' adalah urutan pelarian yang tepat, dan melakukan penggantian pada dobel '"' akan gagal jika string kosong"%~1"
.Salah satu solusi semi terbaik adalah menyalin
%1
ke dalam variabel dan kemudian menggunakan ekspansi tertunda, sebagai delayExp. selalu aman terhadap konten apa pun.Keuntungan dari hal ini adalah berurusan dengan param1 benar-benar aman.
Dan pengaturan param1 akan berfungsi dalam banyak kasus, seperti
Tetapi masih gagal dengan konten aneh seperti
Untuk bisa mendapatkan jawaban yang benar 100% untuk keberadaannya
Mendeteksi jika
%1
kosong, tetapi untuk beberapa konten tidak dapat mengambil konten.Ini juga bisa berguna untuk membedakan antara yang kosong
%1
dan yang satu""
.Ia menggunakan kemampuan
CALL
perintah untuk gagal tanpa membatalkan file batch.Jika Anda ingin 100% bullet proof untuk mengambil konten, Anda bisa membaca Bagaimana cara menerima parameter baris perintah yang paling aneh sekalipun?
sumber
Dari IF / ?:
sumber
%1
dan suka. "Variabel yang ditentukan di dalam file batch" sebenarnya adalah variabel lingkungan saat file batch sedang berjalan, dan Anda dapat menggunakannyaIF DEFINED
.Sayangnya saya tidak memiliki reputasi yang cukup untuk berkomentar atau memilih jawaban saat ini untuk saya harus menulis sendiri.
Awalnya pertanyaan OP mengatakan "variabel" daripada "parameter", yang menjadi sangat membingungkan, terutama karena ini adalah tautan nomor satu di google untuk mencari cara menguji variabel kosong. Sejak jawaban asli saya, Stephan telah mengedit pertanyaan asli untuk menggunakan terminologi yang benar, tetapi daripada menghapus jawaban saya, saya memutuskan untuk meninggalkannya untuk membantu menjernihkan kebingungan, terutama jika google masih mengirim orang ke sini untuk variabel juga:
% 1 BUKAN AYAH ITU ADALAH PARAMETER LINE PERINTAH.
Perbedaan yang sangat penting. Tanda persen tunggal dengan angka setelah itu merujuk ke parameter baris perintah bukan variabel.
Variabel diatur menggunakan perintah set, dan dipanggil kembali menggunakan tanda 2 persen - satu sebelum dan satu sesudah. Misalnya% myvar%
Untuk menguji variabel kosong, Anda menggunakan sintaks "jika tidak didefinisikan" (perintah secara eksplisit untuk variabel tidak memerlukan tanda persen), misalnya:
(Jika Anda ingin menguji parameter baris perintah maka saya sarankan merujuk pada jawaban jamesdlin.)
sumber
if variable is empty
keif parameter is empty
. Saya baru melakukannya. (dengan risiko membatalkan beberapa jawaban, yang memang memeriksa variabel alih-alih parameter dan juga tidak valid, karena mereka tidak menjawab pertanyaan)Gunakan "JIKA perintah variabel DEFINED" untuk menguji variabel dalam file batch.
Tetapi jika Anda ingin menguji parameter batch, coba kode di bawah ini untuk menghindari input yang rumit (seperti "1 2" atau ab ^> cd)
sumber
Saya menguji dengan kode di bawah ini dan itu baik-baik saja.
sumber
IF DEFINED var
karena suatu alasanSaya biasanya menggunakan ini:
Jika% 1 kosong, IF akan membandingkan "." ke "." yang akan mengevaluasi benar.
sumber
Saya membuat skrip kumpulan kecil ini berdasarkan jawaban di sini, karena ada banyak yang valid. Jangan ragu untuk menambahkan ini selama Anda mengikuti format yang sama:
sumber
String kosong adalah sepasang
double-quotes
/""
, kita bisa menguji panjangnya:kemudian uji 2 karakter terhadap
double-quotes
:Inilah skrip kumpulan yang dapat Anda mainkan. Saya pikir itu benar menangkap string kosong.
Ini hanya contoh, Anda hanya perlu menyesuaikan 2 (atau 3?) Langkah-langkah di atas sesuai dengan skrip Anda.
Hasil tes penyiksaan ini:
sumber
""
string kosong adalah string kosong `` dan dalam batch variabel kosong adalah variabel yang tidak ditentukan. Anda dapat menentukan, bahwa untuk argumen Anda, tanda kutip luar akan dihapus, tetapi kemudian senarnya masih kosong dengan panjang 0""
digunakan untuk string kosong juga, tetapi cukup mudah digunakan%~1
untuk menghapus tanda kutip luar. tidak perlu menggunakan solusi yang kompleks"%~1"==""
akan gagal dengan argumen seperti"Long File Name".txt
mana yang merupakan argumen yang valid. sunting : Dan itu jelas tidak rumit seperti yang Anda katakan. Hanya 2 langkah di atas untuk pengujian, sisanya adalah contoh verbose.Kamu bisa memakai
sumber
Skrip 1:
Input ("Hapus Quotes.cmd" "Ini Uji")
Output (Tidak ada,% 1 TIDAK kosong, kosong, atau NULL):
Jalankan ("Hapus Quotes.cmd") tanpa parameter apa pun dengan skrip di atas 1
Output (% 1 kosong, kosong, atau NULL):
Catatan: Jika Anda mengatur variabel di dalam sebuah
IF ( ) ELSE ( )
pernyataan, itu tidak akan tersedia untuk DITETAPKAN sampai setelah itu keluar dari pernyataan "JIKA" (kecuali "Ekspansi Variabel Tertunda" diaktifkan; setelah diaktifkan gunakan tanda seru "!" Sebagai ganti variabel simbol persen "%"}.Sebagai contoh:
Skrip 2:
Input ("Hapus Quotes.cmd" "Ini Uji")
Keluaran:
Catatan: Ini juga akan menghapus tanda kutip dari dalam string.
Sebagai Contoh (menggunakan skrip 1 atau 2): C: \ Users \ Test \ Documents \ Batch Files> "Remove Quotes.cmd" "Ini adalah" a "Test"
Output (Script 2):
Jalankan ("Hapus Quotes.cmd") tanpa parameter apa pun di Skrip 2:
Keluaran:
sumber
Singkatnya:
Kode ini akan menampilkan "string kosong" jika% 1 salah "" atau "atau kosong. Menambahkannya ke jawaban yang diterima yang saat ini salah.
sumber
Saya punya banyak masalah dengan banyak jawaban di internet. Sebagian besar bekerja untuk sebagian besar hal, tetapi selalu ada sudut yang memecah masing-masing.
Mungkin tidak berfungsi jika mendapat tanda kutip, mungkin rusak jika tidak memiliki tanda kutip, kesalahan sintaks jika var memiliki spasi, beberapa hanya akan bekerja pada parameter (sebagai lawan variabel lingkungan), teknik lain memungkinkan kosong set tanda kutip untuk lulus sebagai 'didefinisikan', dan beberapa yang lebih rumit tidak akan membiarkan Anda rantai
else
setelahnya.Inilah solusi yang saya senangi, tolong beri tahu saya jika Anda menemukan kasing sudut yang tidak berhasil.
Memiliki subrutin itu baik dalam skrip Anda, atau dalam skrip itu sendiri
.bat
, harus bekerja.Jadi jika Anda ingin menulis (dalam pseudo):
Kamu bisa menulis:
Ini berhasil untuk semua tes saya:
Echo'd
n
,y
,n
,y
,y
Lebih banyak contoh:
if
?Call :ifSet %var% && Echo set
Call :ifSet %var% || Echo set
Call :ifSet %1 && Echo set
ifSet.bat
? Tidak masalah:((Call ifSet.bat %var%) && Echo set) || (Echo not set)
sumber
(Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo
:, echostrue
andfalse
ifSet
sendiri, kemudian menggunakanIf %errorlevel% EQU 0 (x) Else (y)
set
variabel (seperti[%bob%]
, hanya berfungsi untuk argumen seperti[%2]
) tapi sekarang periksa kembali berfungsi. Saya kira satu-satunya keluhan saya[]
sekarang adalah membiarkan tanda kutip kosong lewat, sedangkan ini tidak akan terjadi (jadi terserah Anda gunakan, sungguh)/B
bendera berhenti seluruh batch dari keluar, hanya keluar subroutine ataucall
'd batch. Kecuali jika Anda bertanya apa yang dilakukan seluruh perintah ; itu mengembalikan kode kesalahan untuk membiarkan skrip panggilan mengetahui hasil subrutin (0
lulus,1
gagal), dapat digunakan melalui logika boolean dalam jawabannya, atau melalui%errorlevel%
dalam komentar di atasMenggunakan! bukannya "untuk memeriksa string kosong
sumber
Saya masuk hanya di bawah satu bulan (meskipun ditanya 8 tahun yang lalu) ... Saya harap dia sudah pindah file batch sekarang. ;-) Saya biasa melakukan ini setiap saat. Saya tidak yakin apa tujuan akhirnya. Jika dia malas seperti saya, go.bat saya bekerja untuk hal-hal seperti itu. (Lihat di bawah) Tapi, 1, perintah di OP bisa tidak valid jika Anda langsung menggunakan input sebagai perintah. yaitu,
adalah perintah yang tidak valid (atau dulu jika Anda berada di drive yang berbeda). Anda perlu memecahnya menjadi dua bagian.
Dan, 2, apa artinya 'terdefinisi' atau 'tidak terdefinisi'? GIGO. Saya menggunakan default untuk menangkap kesalahan. Jika input tidak tertangkap, ia turun untuk membantu (atau perintah default). Jadi, tidak ada input bukan kesalahan. Anda dapat mencoba untuk memasukkan input dan menangkap kesalahan jika ada. (Oke, menggunakan go "unduhan (hanya satu paren) ditangkap oleh DOS. (Harsh!))
Dan, 3, kutipan hanya dibutuhkan di sekitar jalan, bukan perintah. yaitu,
buruk (atau dulu di masa lalu) kecuali Anda berada di drive yang berbeda.
fungsional.
berfungsi jika Anda memiliki ruang di jalur Anda.
sumber
cd
's/d
switch:cd /d "C:\Users\Me" (and the proper path delimeter for Windows is
`, tidak/
).