2012-04-24 8 views
3

폴더 이름이 filename_ex.doc 인 하위 폴더와 파일이 들어있는 폴더 A의 파일 이름을 일괄 적으로 바꿀 수 있으며 filename.doc처럼 보이게 할 수 있습니까?cmd 일괄 처리 이름 바꾸기 하위 폴더/파일

저는 잠시 동안이 작업을 시도해 왔으며 서사시 적으로 실패했습니다. 도와주세요.

+0

@MartinJames, 나는 내가 결코 이제까지 동안 내가 개발 한 코드 조각 중 하나를 게시 할 것이라고, 그래서 거대한 실패 난 F /위한 시도했습니다 다음 단계 ;-) –

+0

, FOR/D 모든 것들을 읽고 여기에서 문서를 읽으십시오 : [link] (http://ss64.com/nt/for.html). 괜찮은 결과는 지금까지는 ... :(나는 윈도우 배치 프로그래밍을 정말로 싫어한다.) – Alex

+0

@MartinJames : 또한 명령 행에서 시도 : tokens = 1-3 delims = _. "% a ('dir * _ex.ext ') do echo % a_ % b. % c' ... 폴더/서브 폴더 또는 다른 파일에 PATH가있는 경우 : "."및 "_" – Alex

답변

3

마틴 제임스에 대한 두 번째 의견의 방향에 문제가있는 하위 폴더의 파일 이름도 변경한다고 가정합니다. DIR/S 옵션으로 코드를 시도한 것 같습니다. 하지만 당신은 너무 가까이에 :-) 당신은 단지 2 개의 루프를 사용해야했습니다!

편집 - 고정 코드 출력이 제대로 표시되면, 그것은 작동 할 수 있도록하기 위해 ECHO 놓습니다. 각 파일 이름이 _ex.ext에 표시되는 내용을보다 _ 또는 . 기타를 가지고 있지 않는 한

@echo off 
for /r %%D in (.) do (
    pushd "%%~fD" 
    for /f "tokens=1-3 delims=_." %%A in ('dir /b *_ex.ext 2^>nul') do echo ren "%%A_%%B.%%C" "%%A.%%C" 
    popd 
) 

위 한 작동합니다. 경로의 문자는 문제가되지 않아야하며 파일 이름 만 문제가됩니다.

여기에는 모든 파일 이름 (유니 코드 이름 제외)에서 작동해야하는보다 강력한 솔루션이 있습니다. 또한 상당히 빠릅니다. 하위 문자열 연산을 사용하므로 이름에서 제거 할 문자 수를 알아야합니다. 귀하의 예에서는 3 자입니다. 결과 명령이 올바르게 보이면 ECHO를 제거하십시오. 내가 배치 "프로그래밍"을하려 할 때마다

@echo off 
setlocal disableDelayedExpansion 
for /f "delims=" %%F in ('dir /b /s *_ex.ext') do (
    set "old=%%F" 
    set "new=%%~nF" 
    setlocal enableDelayedExpansion 
    echo ren "!old!" "!new:~0,-3!.ext" 
    endlocal 
) 
+0

밑줄이있는 경우이 작업이 수행됩니다. 하위 폴더 및 파일 이름에 – Alex

+0

테스트했습니다. 작동하지 않지만 잘못된 것이 있는지 확인합니다. 감사합니다. – Alex

+0

@Alex - 작동하지 않는다고 말하면됩니다 .2 개의 버그가 수정되었습니다. 더 강력하고 빠른 대안을 추가했습니다. – dbenham

관련 문제