Bash ters işaretlerinin toplu eşdeğeri


Yanıtlar:


53

Önce çıktıyı bir dosyaya yönlendirerek yapabilirsiniz. Örneğin:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%

16
Geçici dosyayı depolamak için yazma erişiminizin olduğu bir yer bulmanızı gerektirir; kendinizden sonra temizlemelisiniz; bu örnek yalnızca girişin ilk satırını okumanızı sağlar. Tüm pratik amaçlar için, for /fvaryant çok daha iyidir.
Joey

@grawity - along with%random%
bacar

1
@joey Her satırı okur, ancak tek bir komutta bir komut satırı argümanına nasıl birleştirilir .
user877329

satırsonu (lar) ı nasıl işliyor?
andrewrk

104

Aşağıdaki for /fkomutla cmd.exe komut dosyalarını kullanarak benzer bir işlevsellik elde edebilirsiniz :

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

Evet, pek açık değil (en azını söylemek gerekirse), ama orada olan bu.

Bkz for /?kanlı detaylar için.

Sidenote: echoBir " for /f" komutta " " geri işaretlerinin içinde " " kullanılmasının " cmd.exe /c echo Test" kullanılarak yapılması gerektiğini düşündüm, çünkü echoiçsel bir komut cmd.exe, ama daha doğal bir şekilde çalışıyor. Windows toplu komut dosyaları beni her zaman bir şekilde şaşırtıyor (ama genellikle iyi bir şekilde değil).


2
Bunu, otomatik olarak bir kabuk oluşturmayan harici programlardan kabuk yerleşiklerini çalıştırırken yapmanız gerekir. Ie system()C'ler iyiydi, çünkü her durumda bir kabuk başlatır, ancak .NET'in Process.Startkabuğu açıkça çağırması gerekir. Onun gibi bir şey, Iirc. Her halükarda, bunun kabul edilen cevaptan daha iyi bir cevap olduğunu düşünüyorum :-)
Joey

2
forSorunu incitmemek ama karıştırmak için seçenekler . Peki ya buna:for /f %%a in ('"echo Test"') do my_command %%a
Evan Haas

9
Aynısını komut satırında çalıştırırken, toplu komut dosyası yerine %% yerine tek bir% kullanın.
jsears

2
">" Operatörü gibi borularla iyi çalışmıyor gibi görünüyor. Ama aksi halde bu harika. Tabii bu sadece sahip olduğum bir% - %% sorunu değilse.
Jonathan

3
@Evan: tokens=*önemli. Aksi takdirde, komutun sonucu boşluklar içeriyorsa, sadece ilk kelime çıkarılır. İstemi bu çalıştırın: for /f %a in ('"echo foo bar"') do echo "%a". Basacak "foo".
Dan Dascalescu

29

"For" komutunun belgelerini okuyun: for /?

Ne yazık ki kendim kontrol etmek için Windows'ta oturum açmadım, ancak bunun gibi bir şeyin istediğiniz şeye yakın olabileceğini düşünüyorum:

for /F %i in ('echo Test') do my_command %i

6
Başka birinin bununla karşılaşması durumunda, komut bir toplu iş dosyasından (* .bat) çalıştırıldığında, her iki% i değişkeninin de çift yüzde işareti olması gerekir: %% i.
mgouin

3

Bash'i her zaman Windows içinde çalıştırabilirsiniz . Ben o ile hep yapıyor MSYS (çok daha verimli daha Cygwin ).


Maalesef MSYS şu anda zar zor korunuyor, güncel bir bash elde etmek için ayrı olarak yüklemeniz gerekiyor
Ed Randall

1
BusyBox daha da küçüktür (~ 432KB). Yine de tam bir Bash değil, sadece Ash. Resmi olmayan Windows bağlantı noktasını buradan edinin: frippery.org/busybox
Martin

3

Belki standart for /fyöntemin sözdizimini bozuyorum , ama && ve | içeren çok karmaşık bir komut koyduğumda. sınırında geri işaretler içinde for /fsorunlara neden olur. Her zamankinden küçük bir değişiklik, keyfi bir karmaşıklık komutunu işlemek için mümkündür:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

Tam ve karmaşık komutunuzu önce bir değişkene koyarak, ardından karmaşık komutu doğrudan for döngüsünün sınırına koymak yerine, sınırdaki değişkene bir referans koyarak, sözdizimi yorumlama sorunlarını önleyebilirsiniz. Şu anda VV, yukarıdaki örnekte değişkene ayarladığım tam komutu kullanıldığı yere kopyalarsam, %VV%sözdizimi hatalarına neden olur.


1
Bu benim için işe yaramadı, ancak bir karat (^) ile çıkış yaparsanız doğrudan for komutu içinde borulama yapabileceğinizi öğrendim: for / f "usebackq tokens = *" %% a in (`command ^ | command`) komut %% a
Heptite

@Heptite Card kaçış benim için işe yaramadı, ancak komut satırını çift tırnaklarla çevreledi.
Alexandr Zarubkin

@Heptite Benim durumumda, önceden çalıştırmam gereken komut dizisini bilmiyordum, bunlar bir dosyadan çıkarıldı ve bir durumda başka bir dosyaya verildi. Kaçışla birlikte, kaç tercümandan geçeceğine bağlı olarak komuttan kaç kez kaçmanız gerektiğini bilmeniz gerekir ve benim kullanım durumlarımda tutarlı sayıda tercüman yoktu.
mtalexan
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.