Windows batch: memanggil lebih dari satu perintah dalam loop FOR?

124

Apakah mungkin dalam file batch Windows untuk memanggil lebih dari satu perintah dalam satu FOR loop? Katakanlah misalnya saya ingin mencetak nama file dan setelah menghapusnya:

@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.

Saya tahu dalam kasus ini saya bisa menyelesaikannya dengan melakukan dua loop FOR yang berbeda: satu untuk menampilkan nama dan satu untuk menghapus file, tetapi apakah mungkin melakukannya hanya dalam satu loop?

Marco Demaio
sumber

Jawaban:

117
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
SilverSkin
sumber
2
Sebenarnya, menurut saya tanda kurung tidak diperlukan. for %i in (1 2 3) do echo %i & echo foomencetak apa yang saya harapkan: "1", "foo", "2", "foo", "3", "foo" (pada baris terpisah).
bk1e
Tidak seharusnya menjadi &&bukan &?
jww
9
@jww &&akan gagal jika perintah pertama gagal, &akan tetap menjalankan perintah kedua.
yyny
Jika solusi ini membuat kesalahan sintaks untuk Anda, periksa apakah Anda memiliki paren yang tidak lolos antara DO-parens. Anda dapat menghindarinya dengan menambahkan a ^pada mereka.
Константин Ван
199

Penggunaan &boleh saja untuk perintah pendek, tetapi baris tunggal itu bisa menjadi sangat panjang dengan sangat cepat. Jika itu terjadi, alihkan ke sintaks multi-baris.

FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)

Penempatan (dan )masalah. Tanda kurung bulat setelahnya DOharus ditempatkan pada baris yang sama, jika tidak, file batch akan salah.

Lihat if /?|find /V ""untuk detailnya.

Anders
sumber
12
Solusi ini terlihat bersih dan mudah dibaca. Saya juga akan memperingatkan setiap programmer yang menggunakan solusi ini bahwa braket bulat setelah DOTIDAK boleh ditempatkan baris berikutnya jika tidak maka rem file batch. Dalam kode ketika saya menulis for loop saya biasanya menempatkan {baris berikutnya kurung kurawal .
Marco Demaio
2
Juga - berhati-hatilah jika ada perintah bersarang Anda yang memiliki tanda kurung (misalnya, sesuatu seperti "echo Sesuatu sesuatu (sesuatu yang lain)" EDIT: ah, lihat jawaban
bk1e
31

SilverSkin dan Anders keduanya benar. Anda dapat menggunakan tanda kurung untuk menjalankan beberapa perintah. Namun, Anda harus memastikan bahwa perintah itu sendiri (dan parameternya) tidak mengandung tanda kurung. cmddengan rakus menelusuri kurung tutup pertama, alih-alih menangani kumpulan tanda kurung bertingkat dengan baik. Hal ini dapat menyebabkan sisa baris perintah gagal untuk diurai, atau mungkin menyebabkan beberapa tanda kurung diteruskan ke perintah (misalnya DEL myfile.txt)).

Solusi untuk ini adalah dengan membagi badan loop menjadi fungsi terpisah. Perhatikan bahwa Anda mungkin perlu melompat-lompat di sekitar badan fungsi untuk menghindari "jatuh" ke dalamnya.

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X
REM Don't "fall through" to :loopbody.
GOTO :EOF

:loopbody
ECHO %1
DEL %1
GOTO :EOF
bk1e
sumber
3
Sementara kita berada di topik,% X tidak pernah benar ketika berurusan dengan nama file, selalu gunakan "% ~ X" (Dalam contoh Anda di sini, Anda mungkin bisa lolos dengan menggunakan% * dalam subfungsi mungkin)
Anders
1
Itu poin yang sangat bagus. Contoh yang baik dari jalur yang menunjukkan kedua masalah tersebut adalah C:\Program Files (x86).
bk1e