2011-03-07 4 views
3

내가이 개 배치 파일 (XP)이 : 디렉토리라는 -Create배치 파일에서 SetDelayedExpansion 사용 : 포함 된 dirs/파일 이름 처리!

: 문제를 입증

echo %1 

:

TEST.BAT :

setlocal EnableDelayedExpansion 

rem check for argument 
if [%1]==[] goto :noarg 

:arg 
rem check for trailing backslash and remove it if it's there 
set dirname=%1 
IF !dirname:~-1!==\ SET "dirname=!dirname:~0,-1!" 

rem find all log files in passed directory and call test2.bat for each one 
for /f "tokens=* delims= " %%a in ('dir !dirname!\*.log /s /b') do call test2.bat "%%a" 

goto :finish 

:noarg 
rem prompt for directory to scan 
set /p dirname=Type the drive or directory, then hit enter: 

rem loop if nothing entered 
if [!dirname!]==[] goto :noarg 

rem check for trailing backslash and remove it if it's there 
IF !dirname:~-1!==\ SET "dirname=!dirname:~0,-1!" 

rem find all log files in passed directory and call test2.bat for each one 
for /f "tokens=* delims= " %%a in ('dir "!dirname!"\*.log /s /b') do call test2.bat "%%a" 

goto :finish 

:finish 

test2.bat을 c : \ test와 c : \ test! 각 디렉토리에 빈 test.log 파일을 넣으십시오.

그런 다음 실행

예상대로이 작동
test c:\test 

(test2.bat 에코 "C : \ 테스트 \의 test.log") 이제

실행

test c:\test! 

문제를 test2.bat는 원하는 "c : \ test! \ test.log"대신 "c : \ test \ test.log"를 반향 출력합니다)

! EnableDelayedExpansion 사용을 위해 예약되어 있습니다.

setlocal DisableDelayedExpansion 

endlocal 
:이 솔루션은 "사용 % 확대"인 경우에, 나는 내가

내가 주변에 찌르고했습니다 (Handling trailing backslash & directory names with spaces in batch files 당) DelayedExpansion를 사용해야하기 때문에 중단 해요

How can I escape an exclamation mark ! in cmd scripts?

(PEBCAK 일 수 있음).

의견이 있으십니까?

답변

2

문제는 % 1 및 %% a의 확장이며 지연된 확장입니다! 제거됩니다.
먼저 지연된 확장을 비활성화해야합니다.
Btw. 후행 슬래시 제거가 필요하지 않습니다 (EDIT : 루트 경로가 아닌 경우에만 true)

setlocal DisableDelayedExpansion 

rem check for argument 
if "%~1"=="" goto :noarg 

:arg 
set "dirname=%~1" 

rem find all log files in passed directory and call test2.bat for each one 
for /f "tokens=* delims=" %%a in ('dir "%dirname%\*.log" /s /b') do (
    set "file=%%~a" 
    setlocal EnableDelayedExpansion 
    echo found #!file!# 
    call test2.bat "!file!" 
    endlocal 
) 
+0

다시 @jeb! 그냥 내가 뭔가를 생각하고있을 때 ... 왜 백 슬래시를 제거 할 필요가 없는지 설명해 주시겠습니까? 예를 들어, 사용자가 c : \를 전달하는 것을 처리하는 중입니다. - for/F 행이 다음과 같은 이유로 오류가 발생합니다 :''c : \\ *. log "' –

+0

@Craig H : 루트 dir과는 작동하지 않지만 c : \ temp \\ *. log (두 번째 경우 만 테스트합니다.) – jeb

+0

해명 해 주셔서 감사합니다. 뭔가를 간과했는지 확인하고 싶었습니다. 도와 주셔서 다시 한 번 감사드립니다! –

관련 문제