Windows'da, döngü için özyinelemeli bir toplu iş dosyası ve boşluklar içeren bir dosya adı


9

Böyle bir klasör ağacım var (bu sadece bir örnek, gerçek durumumda daha derin olacak):

C:\test
|   
+---folder1
|       foo bar.txt
|       foobar.txt
|       
+---folder2
|       foo bar.txt
|       foobar.txt
|       
\---folder3
        foo bar.txt
        foobar.txt

Dosyalarım adında bir veya daha fazla boşluk var ve ben onlara bir komut gerçekleştirmeliyim, bu yüzden foo bar.txt ile ilgileniyorum ama foobar.txt ile ilgilenmiyorum.

Denedim (bir toplu iş dosyası içinde):

for /r test %%f in (foo bar.txt) do if exist %%f echo %%f

burada komut basittir echo.
Çalışmıyor çünkü alan atlandı ve çıktı almadım.

Bu işe yarıyor ama ihtiyacım olan şey bu değil:

for /r test %%f in (foobar.txt) do if exist %%f echo %%f

Yazdırır:

C:\test\folder1\foobar.txt
C:\test\folder2\foobar.txt
C:\test\folder3\foobar.txt

Tırnak işareti (") kullanarak denedim ama çalışmıyor:

for /r test %%f in ("foo bar.txt") do if exist %%f echo %%f

Tırnak işareti hala çıktıda yer aldığından çalışmaz:

C:\test\folder1\"foo bar.txt"
C:\test\folder2\"foo bar.txt"
C:\test\folder3\"foo bar.txt"

Yanıtlar:


9

Buna ne dersin?

for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)

dir özyineleme dir taşımak için iyi bir fikir! Teşekkür ederim.
Alessandro Jacopson

2

Özyinelemeli anahtar olmadan, FORtırnak işaretlerini yazdırmamayı söyleyebilirsiniz :

for %%f in ("foo bar.txt") do @if exist %%f echo %~dpnxf

Yuvalanmış FORdeyimler yapabilirsiniz. Dış kısım dizin ağacını yürüdü ve iç taraf yukarıdaki ağaçtı.


Merhaba, Cevabınız için teşekkür ederim. Soruyu düzenledim, ağaç sadece bir seviyeden daha derin olabilir ve bu yüzden özyinelemeye ihtiyacım var.
Alessandro Jacopson

2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...özyinelemeli, ancak çalışmasını sağlamak için çalışması gereken bazı şeyler olacaktır. Örneğin, gecikmeli genişletme kullanmanız gerekebilir. SETLOCAL ENABLEDELAYEDEXPANSIONve !varname!vb
bir sonraki duyuruya kadar durdurulmuş.

% ~ dpnf dosya uzantısını atlar.
dolmen

@dolmen: Yazım hatası düzeltildi.
sonraki duyuruya kadar duraklatıldı.

2

Forfiles komutuna bakmak isteyebilirsiniz.

forfiles /S /M "* *" /C "cmd /C echo @PATH"

'/ S' - Özyineleme. Tüm alt dizinleri ara

'/ M "* *"' - Dosya maskesi. Yalnızca adlarında boşluk bulunan dosyaları arayın.

'/ C "cmd / C yankı @PATH"' - Komut. Bulunan tüm dosyalarda bu komutu verin.

Örnek çıktı:

"C:\test\folder1\foo bar.txt"
"C:\test\folder2\foo bar.txt"
"C:\test\folder3\foo bar.txt"

0

Bayrak f, mutlak bir dosya adı witout tırnak almak için ihtiyaç duyduğunuz bayraktır (böylece ihtiyacınız varsa tırnak işaretleri koyabilirsiniz). Ancak, seçtiğiniz değişken adıyla çakıştığından başka bir tane kullanmanız gerekir:

for /r test %%i in ("foo bar.txt") do echo %%~fi

Bu tamamen yanlış. Değişken ad çakışması yoktur ve tırnaklar gösterdiğiniz komutla yazdırılır.
sonraki duyuruya kadar duraklatıldı.

0

Teşekkürler Dennis! Ben de neredeyse özdeş bir problem üzerinde çalışıyordum. Ben bir girdi parm dosya adları için bir arama dizesi olarak - özyinelemeli dizinler üzerinden geçirebileceği bir yarasa dosyası istedim. Bunun burada başka biri için yararlı olması durumunda.

::+++++++++
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /R %%d in (.) do (
   for /f "usebackq" %%i in (`dir /b %%d ^| findstr /i %1`) do (
      echo Processing %%i
   )
)
endlocal
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.