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.

Francis
sumber

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.

nik
sumber
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.

Jonathan Headland
sumber
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 "<".

banyak waktu luang
sumber
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

Jesse Dearing
sumber
0
Set "dateTime="
For /F %%A In ('powershell get-date -format "{yyyyMMdd_HHmm}"') Do Set "dateTime=%%A"
echo %dateTime%
pause

masukkan deskripsi gambar di sini Dokumen resmi Microsoft untuk forperintah

alchi baucha
sumber