Batch setara dengan pukulan balik Bash

97

Saat bekerja dengan Bash, saya dapat menempatkan output dari satu perintah ke perintah lain seperti:

my_command `echo Test`

akan menjadi hal yang sama seperti

my_command Test

(Jelas, ini hanyalah contoh non-praktis.)

Saya hanya ingin tahu apakah Anda dapat melakukan hal yang sama di Batch.

MiffTheFox
sumber

Jawaban:

53

Anda dapat melakukannya dengan mengarahkan output ke file terlebih dahulu. Sebagai contoh:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
zvrba
sumber
16
Ini mengharuskan Anda menemukan tempat di mana Anda memiliki akses tulis untuk menyimpan file sementara; Anda harus membersihkan diri Anda sendiri; contoh ini hanya memungkinkan Anda membaca baris input pertama. Untuk semua tujuan praktis, for /fvariannya jauh lebih baik.
Joey
@grawity - bersama dengan%random%
bacar
1
@joey Itu membaca setiap baris, tapi bagaimana menggabungkan ke argumen baris perintah dalam satu perintah.
pengguna877329
bagaimana cara menangani baris baru?
andrewrk
103

Anda bisa mendapatkan fungsionalitas serupa menggunakan skrip cmd.exe dengan for /fperintah:

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

Ya, itu agak tidak jelas (untuk sedikitnya), tapi itulah yang ada di sana.

Lihat for /?detail berdarahnya.

Catatan kecil: Saya pikir untuk menggunakan " echo" di dalam backticks dalam sebuah for /fperintah " " perlu dilakukan menggunakan " cmd.exe /c echo Test" karena echomerupakan perintah internal untuk cmd.exe, tetapi ini bekerja dengan cara yang lebih alami. Skrip batch Windows selalu mengejutkan saya (tetapi biasanya tidak dengan cara yang baik).

Michael Burr
sumber
2
Anda biasanya harus melakukan ini saat menjalankan shell-builtins dari program eksternal yang tidak secara otomatis menelurkan shell. Ie C system()baik-baik saja, iirc, karena ia memulai shell dalam hal apa pun, tetapi Process.Startkebutuhan .NET untuk secara eksplisit memanggil shell. Sesuatu seperti itu, iirc. Bagaimanapun, saya menganggap ini sebagai jawaban yang lebih baik daripada yang diterima :-)
Joey
2
Opsi untuk fortidak menyakiti tetapi membingungkan masalahnya. Bagaimana dengan ini:for /f %%a in ('"echo Test"') do my_command %%a
Evan Haas
9
Gunakan satu%, bukan %% saat menjalankan hal yang sama di baris perintah, bukan di skrip batch.
jsears
2
Tampaknya tidak berfungsi dengan baik dengan pemipaan, misalnya operator ">". Tapi selain itu ini luar biasa. Kecuali ini hanya masalah% vs %% yang saya alami.
Jonathan
3
@ Evan: tokens=*penting. Sebaliknya, jika hasil dari perintah menyertakan spasi, hanya kata pertama yang menjadi keluaran. Jalankan ini pada prompt: for /f %a in ('"echo foo bar"') do echo "%a". Ini akan dicetak "foo".
Dan Dascalescu
29

Baca dokumentasi untuk perintah "untuk": for /?

Sayangnya saya tidak masuk ke Windows untuk memeriksanya sendiri, tetapi saya pikir sesuatu seperti ini dapat mendekati apa yang Anda inginkan:

for /F %i in ('echo Test') do my_command %i
Weeble
sumber
6
Jika ada orang lain yang tersandung dalam hal ini, ketika perintah dijalankan dari file batch (* .bat), kedua variabel% i harus menjadi tanda persen ganda: %% i.
mgouin
3

Anda selalu dapat menjalankan Bash di dalam Windows. Saya melakukannya sepanjang waktu dengan MSYS (jauh lebih efisien daripada Cygwin ).

davr
sumber
Sayangnya MSYS hampir tidak dipertahankan sekarang, untuk mendapatkan pesta terbaru Anda perlu menginstalnya secara terpisah
Ed Randall
1
BusyBox bahkan lebih kecil (~ 432KB). Bukan Bash penuh, hanya Ash. Dapatkan port Windows resmi di sini: frippery.org/busybox
Martin
3

Mungkin saya mengacaukan sintaks for /fmetode standar , tetapi ketika saya meletakkan perintah yang sangat kompleks yang melibatkan && dan | dalam backticks di batas tersebut for /f, itu menyebabkan masalah. Sedikit modifikasi dari biasanya dimungkinkan untuk menangani perintah kompleksitas arbitrer:

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

Dengan meletakkan perintah lengkap dan kompleks Anda di variabel terlebih dahulu, kemudian meletakkan referensi ke variabel di limit daripada meletakkan perintah kompleks langsung ke dalam batas loop for, Anda dapat menghindari masalah interpretasi sintaks. Saat ini jika saya menyalin perintah tepat yang telah saya setel ke VVvariabel dalam contoh di atas ke tempat ia digunakan %VV%, itu menyebabkan kesalahan sintaks.

mtalexan.dll
sumber
1
Ini tidak berhasil untuk saya, tetapi saya menemukan bahwa Anda dapat melakukan pemipaan langsung di dalam perintah for jika Anda meloloskan diri dengan carat (^): for / f "usebackq tokens = *" %% a in (`command ^ | command`) lakukan perintah %% a
Heptite
Pelolosan @ Kartu Heptite tidak berfungsi untuk saya, tetapi baris perintah di sekitarnya dengan tanda kutip ganda berhasil.
Alexandr Zarubkin
@ Heptite Dalam kasus saya, saya tidak tahu rangkaian perintah yang harus saya jalankan sebelumnya, mereka diekstraksi dari file dalam satu kasus, dan diteruskan dalam kasus lain. Dengan melarikan diri, Anda perlu tahu berapa kali untuk melarikan diri dari perintah berdasarkan berapa banyak penerjemah yang akan dijalankan, dan dalam kasus penggunaan saya itu bukan jumlah penerjemah yang konsisten.
mtalexan