Windows toplu işi: FOR döngüsünde birden fazla komut mu çağırılsın?


124

Windows toplu iş dosyasında tek bir FOR döngüde birden fazla komut çağırmak mümkün müdür ? Diyelim ki dosya adını yazdırmak istiyorum ve sildikten sonra:

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

Bu durumda bunu iki farklı FOR döngüsü yaparak çözebileceğimi biliyorum: biri adı göstermek ve diğeri dosyayı silmek için, ancak bunu yalnızca bir döngüde yapmak mümkün müdür?

Yanıtlar:


117
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)

2
Aslında parantezlerin gereksiz olduğunu düşünüyorum. for %i in (1 2 3) do echo %i & echo foobeklediğim şeyi yazdırır: "1", "foo", "2", "foo", "3", "foo" (ayrı satırlarda).
bk1e

Daha &&çok olması gerekmez &mi?
jww

9
&&İlk komut başarısız olursa @jww başarısız olur, &ne olursa olsun ikinci komutu yürütür.
yyny

Bu çözüm sizin için bir sözdizimi hatası yapıyorsa, DO-parenler arasında çıkış karaktersiz bir parantez olup olmadığına bakın. Onlara bir ekleyerek onlardan kaçabilirsiniz ^.
Константин Ван

199

&Kısa komutlar için kullanmak iyidir, ancak bu tek satır çok hızlı bir şekilde uzun sürebilir. Bu olduğunda, çok satırlı sözdizimine geçin.

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

Yerleşimi (ve )önemli. Sonraki yuvarlak parantezler DOaynı satıra yerleştirilmelidir, aksi takdirde toplu iş dosyası yanlış olacaktır.

Ayrıntılar if /?|find /V ""için bakın.


12
Bu çözüm temiz ve okunabilir görünüyor. Ayrıca, bu çözümü kullanan herhangi bir programcıyı, bundan sonraki yuvarlak parantezin DOsonraki satıra YERLEŞTİRİLMEMESİ gerektiği konusunda uyarırdım, aksi takdirde toplu iş dosyasını frenler. Kodda bir for döngüsü yazdığımda genellikle bir {sonraki satıra küme parantezi yerleştiririm .
Marco Demaio

2
Ayrıca - iç içe geçmiş komutlarınızdan herhangi birinde köşeli parantez varsa dikkatli olun (örneğin, "echo Bir şey (başka bir şey)" gibi bir şey DÜZENLE: ah, bk1e'nin cevabına bakın :)
Tim Barrass

31

SilverSkin ve Anders haklı. Birden çok komutu yürütmek için parantez kullanabilirsiniz. Ancak, komutların kendilerinin (ve parametrelerinin) parantez içermediğinden emin olmalısınız. cmdİç içe geçmiş parantez kümelerini incelikle ele almak yerine, açgözlülükle ilk kapanış parantezini arar. Bu, komut satırının geri kalanının ayrıştırılamamasına neden olabilir veya bazı parantezlerin komutlara geçirilmesine neden olabilir (örn. DEL myfile.txt)).

Bunun için geçici bir çözüm, döngünün gövdesini ayrı bir işleve bölmektir. İçine "düşmekten" kaçınmak için muhtemelen işlev gövdesinin etrafından atlamanız gerektiğini unutmayın.

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

3
Konu üzerindeyken,% X dosya adlarıyla uğraşırken asla doğru değildir, her zaman "% ~ X" kullanın (Buradaki örneğinizde, muhtemelen alt işlevde% * kullanmaktan kurtulabilirsiniz)
Anders

1
Bu gerçekten iyi bir nokta. Her iki sorunu da gösteren iyi bir yol örneği C:\Program Files (x86).
bk1e
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.