Bir Windows toplu iş dosyasındaki bir komutun sonucuyla bir değişkenin değerini ayarlayın


99

Bash ortamında çalışırken , bir değişkenin değerini bir komutun sonucu olarak ayarlamak için genellikle şunu yapıyorum:

var=$(command -args)

varkomut tarafından ayarlanan değişken nerede command -args. Daha sonra bu değişkene olarak erişebilirim $var.

Hemen hemen her Unix kabuğu ile uyumlu olan bunu yapmanın daha geleneksel bir yolu şudur:

set var=`command -args`

Bununla birlikte, bir Windows toplu iş dosyasındaki bir komutun sonucuyla bir değişkenin değerini nasıl ayarlayabilirim ? Denedim:

set var=command -args

Ama bunun komutun çıktısından çok varolarak ayarlandığını görüyorum command -args.

Yanıtlar:


63

Jesse'nin tarif ettiği şeyi yapmak için , bir Windows toplu iş dosyasından şunları yazmanız gerekecek:

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

Ancak, Unix tipi komut dosyası oluşturmaya alışkınsanız , bunun yerine Windows sisteminizde Cygwin kullanmanızı öneririm .


19
for /f "delims=" %a in ('ver') do @set foobar=%akomut isteminde kullanın . for /f "delims=" %%a in ('ver') do @set foobar=%%akomut dosyalarında kullanım
georg

Hafif bir alternatif, Windows On Gnu'dur ( github.com/bmatzelle/gow/wiki ). Bir komut istemi açın ve çalıştırın bash. Ardından bash komutları yazabilirsiniz. Ayrıca bash betikleri de çalıştırabilirsiniz.
Nathan

4
Komutunuz bir dikey çizgi içeriyorsa, bu durumda bir düzeltme işareti ile çıkış yapmanız gerektiğini unutmayın, örneğin: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ foobar ayarla = %% a
yoyo

35

Windows toplu iş komutundan bu yana biraz dikkatli olunması gerekiyor:

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

Unix kabuk ifadesiyle aynı semantiğe sahip değildir:

theValue=`command`

Komutun başarısız olduğu ve bir hataya neden olduğu durumu düşünün.

Unix kabuk sürümünde, "theValue" ataması hala gerçekleşir ve önceki herhangi bir değer boş bir değerle değiştirilir.

Windows toplu sürümünde, hatayı işleyen "for" komutudur ve "do" yan tümcesine asla ulaşılmaz - bu nedenle önceki "theValue" değeri korunur.

Windows toplu komut dosyasında daha fazla Unix benzeri semantik elde etmek için atamanın gerçekleştiğinden emin olmalısınız:

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

Bir Unix komut dosyasını Windows kümesine dönüştürürken değişkenin değerinin temizlenememesi, küçük hataların bir nedeni olabilir.


2
Windows ve * nix arasındaki ince farkı açıkladığınız için teşekkür ederiz.
Jeroen Wiert Pluimers

3
Ayrıca içindeki herhangi bir özel karakterden kaçınmayı unutmayın command; örneğin: for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a.
Bill_Stewart

@Bill_Stewart az önce günümü kurtardın, bir an için borulu komutların çıktısını bir değişkene atamanın çok daha zor olduğunu düşündüm
MrBrody

19

Toplu iş dosyamda bir veritabanı sorgusunun sonuçlarına ihtiyacım olduğunda bunu şu şekilde yaparım:

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

Anahtar 2. satırdadır: "set / p", "<" yeniden yönlendirme operatörü aracılığıyla "__query.tmp" içindeki ilk satırın (yalnızca) "sonuç" değerini ayarlar.


14

Bunun yapıldığını görmemin tek yolu, bunu yapman:

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

ver Windows için sürüm komutudur ve sistemimde şunu üretir:

Microsoft Windows [Version 6.0.6001]

Kaynak


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.