Apa perbedaan antara% dan %% dalam file cmd?

88

Saya baru-baru ini menyertakan baris yang mirip dengan ini di file .cmd:

for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"

Awalnya saya hanya menggunakan% f, dan ini akan bekerja dengan baik saat dijalankan pada baris perintah, tetapi tidak saat dijalankan melalui file. Saat saya beralih ke %% f, ini berfungsi di file. Hanya ingin tahu apa bedanya.

Tyler
sumber

Jawaban:

138

(Penjelasan lebih detail dapat ditemukan di artikel Microsoft KB yang diarsipkan .)

Tiga hal yang perlu diketahui:

  1. Tanda persen digunakan dalam file batch untuk mewakili parameter baris perintah: %1, %2, ...
  2. Tanda dua persen dengan karakter apa pun di antaranya diartikan sebagai variabel:

    echo %myvar%

  3. Dua persen tanda tanpa apa pun di antaranya (dalam file batch) diperlakukan seperti tanda persen tunggal dalam perintah (bukan file batch):%%f

Kenapa begitu?

Misalnya, jika kami menjalankan baris perintah (yang disederhanakan) Anda

FOR /f %f in ('dir /b .') DO somecommand %f

dalam file batch, aturan 2 akan mencoba menafsirkan

%f in ('dir /b .') DO somecommand %

sebagai variabel. Untuk mencegahnya, Anda harus menerapkan aturan 3 dan melepaskan diri %dengan detik %:

FOR /f %%f in ('dir /b .') DO somecommand %%f
marapet
sumber
21
Apakah ada penjelasan mengapa saya bisa lolos dengan hanya menggunakan satu persen tanda dalam loop FOR, ketika dijalankan langsung dari prompt perintah, dan bukan dari file batch? Saya tahu tentang warisan DOS, tetapi sekarang kita dapat menggunakan variabel dari baris perintah.
Alec Mev
6
Selain itu, pastikan variabelnya adalah satu karakter.
jiggunjer
1
Bagaimana jika saya ingin mengeluarkan perintah yang memiliki% di dalamnya misalnya: for / f %% i in ('git log -1 --pretty = format: "%% H"') lakukan set GIT_COMMIT = %% i
Wakan Tanka
15

Di DOS Anda tidak dapat menggunakan variabel lingkungan pada baris perintah, hanya dalam file batch, di mana mereka menggunakan %tanda sebagai pembatas. Jika Anda menginginkan %tanda literal dalam file batch, misalnya dalam sebuah echopernyataan, Anda perlu menggandakannya.

Ini dibawa ke Windows NT yang mengizinkan variabel lingkungan pada baris perintah, namun untuk kompatibilitas mundur Anda masih perlu menggandakan %tanda Anda dalam file .cmd.

Neil
sumber