Tetapkan nilai variabel dengan hasil dari perintah di file batch Windows


99

Saat bekerja di lingkungan Bash , untuk menetapkan nilai variabel sebagai hasil dari sebuah perintah, saya biasanya melakukan:

var=$(command -args)

dimana varvariabel yang ditetapkan oleh perintah command -args. Saya kemudian dapat mengakses variabel itu sebagai $var.

Cara yang lebih konvensional untuk melakukan ini yang kompatibel dengan hampir semua shell Unix adalah:

set var=`command -args`

Yang mengatakan, bagaimana saya bisa mengatur nilai variabel dengan hasil perintah dalam file batch Windows ? Saya sudah mencoba:

set var=command -args

Tapi saya menemukan yang vardiatur ke command -argsdaripada output dari perintah.

Jawaban:


63

Untuk melakukan apa yang dijelaskan Jesse , dari file batch Windows Anda perlu menulis:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

Tapi, saya malah menyarankan menggunakan Cygwin pada sistem Windows Anda jika Anda terbiasa dengan skrip tipe Unix.


19
gunakan for /f "delims=" %a in ('ver') do @set foobar=%apada command prompt. digunakan for /f "delims=" %%a in ('ver') do @set foobar=%%adalam file skrip
georg

Alternatif ringan adalah Gnu On Windows ( github.com/bmatzelle/gow/wiki ). Cukup buka command prompt dan jalankan bash. Kemudian Anda dapat menulis perintah bash. Anda juga dapat menjalankan skrip bash.
Nathan

4
Perhatikan bahwa jika perintah Anda menyertakan pipa maka Anda harus menghindarinya dengan tanda sisipan, misalnya: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ set foobar = %% a
yoyo

35

Seseorang perlu berhati-hati, karena perintah batch Windows:

for /f "delims=" %%a in ('command') do @set theValue=%%a

tidak memiliki semantik yang sama dengan pernyataan shell Unix:

theValue=`command`

Pertimbangkan kasus di mana perintah gagal, menyebabkan kesalahan.

Dalam versi shell Unix, penetapan ke "theValue" masih terjadi, setiap nilai sebelumnya diganti dengan nilai kosong.

Dalam versi batch Windows, itu adalah perintah "untuk" yang menangani kesalahan, dan klausa "lakukan" tidak pernah tercapai - jadi nilai "theValue" sebelumnya akan dipertahankan.

Untuk mendapatkan lebih banyak semantik mirip Unix di skrip batch Windows, Anda harus memastikan bahwa penetapan dilakukan:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

Gagal menghapus nilai variabel saat mengonversi skrip Unix ke kumpulan Windows dapat menjadi penyebab kesalahan kecil.


2
Terima kasih telah menjelaskan perbedaan halus antara Windows dan * nix.
Jeroen Wiert Pluimers

3
Juga ingat untuk meloloskan diri dari karakter khusus apa pun di command; mis for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a. : .
Bill_Stewart

@Bill_Stewart Anda baru saja menyelamatkan hari saya, untuk sesaat saya pikir itu jauh lebih sulit untuk menetapkan output dari perintah pipa ke variabel
MrBrody

19

Inilah cara saya melakukannya ketika saya membutuhkan hasil kueri database di file batch saya:

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

Kuncinya ada di baris 2: "set / p" menetapkan nilai "hasil" ke nilai baris pertama (hanya) di "__query.tmp" melalui operator pengalihan "<".


14

Satu-satunya cara saya melihatnya dilakukan adalah jika Anda melakukan ini:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver adalah perintah versi untuk Windows dan di sistem saya ia menghasilkan:

Microsoft Windows [Version 6.0.6001]

Sumber


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.