Windows에서 재귀 for 루프가있는 배치 파일 및 공백을 포함한 파일 이름


9

나는 이와 같은 폴더 트리를 가지고있다 (이것은 단지 예일 뿐이며, 실제 경우에는 더 깊을 것이다) :

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

내 파일 이름에 공백이 하나 이상 있으므로 명령을 수행해야하므로 foo bar.txt에는 관심이 있지만 foobar.txt에는 관심이 없습니다.

배치 파일 내부에서 시도했습니다.

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

여기서 명령은 간단 echo합니다.
공간을 건너 뛰고 출력이 없기 때문에 작동하지 않습니다.

이것은 작동하지만 필요한 것은 아닙니다.

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

다음을 인쇄합니다.

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

따옴표 ( ")를 사용하려고했지만 작동하지 않습니다.

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

따옴표가 여전히 출력에 포함되어 있기 때문에 작동하지 않습니다.

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

답변:


9

이건 어때요?

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

재귀를 dir로 옮기는 것이 좋습니다! 감사합니다.
Alessandro Jacopson

2

재귀 스위치가 없으면 FOR따옴표를 인쇄하지 말라고 할 수 있습니다 .

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

중첩 된 FOR명령문 을 수행 할 수 있습니다 . 외부는 디렉토리 트리를 걷고 내부는 위의 디렉토리 트리입니다.


안녕하세요, 답변 감사합니다. 질문을 편집했는데 트리가 한 수준보다 깊을 수 있으므로 재귀가 필요합니다.
Alessandro Jacopson

2
@uvts_cvs : FOR /R %%d in (.) DO for %%f ...는 재귀 적이지만 작동시키기 위해 해결해야 할 것이 있습니다. 예를 들어 지연 확장을 사용해야 할 수도 있습니다. SETLOCAL ENABLEDELAYEDEXPANSION!varname!, 등
추후 공지가있을 때까지 일시 중지.

% ~ dpnf는 파일 확장자를 생략합니다.
고인돌

@ 고인돌 : 오타가 수정되었습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

2

forfiles 명령을보고 싶을 수도 있습니다.

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

'/ S'-재귀 모든 하위 디렉토리 검색

'/ M "* *"'-파일 마스크. 이름에 공백이있는 파일 만 검색하십시오.

'/ C "cmd / C echo @PATH"'-명령. 발견 된 모든 파일에서이 명령을 실행하십시오.

출력 예 :

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

0

플래그 f는 절대 파일 이름 witout 따옴표를 얻는 데 필요한 플래그 입니다 (따라서 필요한 경우 따옴표를 넣을 수 있습니다). 그러나 선택한 변수 이름과 충돌하기 때문에 다른 변수 이름을 사용해야합니다.

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

완전히 틀 렸습니다. 변수 이름 충돌이 없으며 표시하는 명령으로 따옴표가 인쇄됩니다.
추후 공지가있을 때까지 일시 중지되었습니다.

0

고마워, 데니스! 나도 거의 같은 문제를 해결하고 있었다. 디렉토리를 통해 재귀 적으로 파일 이름의 검색 문자열로 입력 매개 변수를 전달할 수있는 박쥐 파일을 원했습니다. 이것이 다른 사람에게 유용한 경우를 대비하여 여기에 있습니다.

::+++++++++
@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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.