2014-10-15 3 views
0

디렉토리의 모든 파일의 이름을 +250으로 바꾼 배치 파일을 만들어 문자열의 특정 위치에있는 특정 번호로 바꿔야합니다.일괄 처리 : 특정 숫자를 문자열로 바꾸는 파일 이름 바꾸기

예를 들어 설명해 보겠습니다.

INPUT FILES :

  • 1410141603209_f06t 003 v0003600000F.dat.gz
  • 1410141603508_f06t 005 v0003600000F.dat.gz
  • 1410141603508_f06t 006 v0003600000F.dat.gz
  • 1410141603508_f06t 010 v0003600000F.dat.gz

OUTPUT FILES :

  • 1410141603209_f06t 253 v0003600000F.dat.gz
  • 1410141603508_f06t 255 v0003600000F.dat.gz
  • 1410141603508_f06t v0003600000F.dat.gz
  • 1410141603508_f06t 260 v0003600000F.dat.gz

당신이 볼 수 있듯이, 내가 변경해야 할 문자열의 유일한 부분은 250를 합산, 굵은 부분입니다. 입력 파일이 도달 할 수있는 가장 높은 번호는 010이므로 출력 파일이 도달 할 수있는 가장 높은 번호는 260입니다.

도움을 주신 모든 분께 감사드립니다 !!!

답변

1
@echo off 
rem main cycle 
for %%i in (*.gz) do call :rename_to_increased_number %%i 
rem finish and go home 
goto end 


rem "function" rename_to_increased_number - receive one filename and rename it 
:rename_to_increased_number 

SET FN=%~1 
rem FN - is full file name 

SET NUMBER=%FN:~18,3% 
rem NUMBER - is a part of filename from 18 to 21 symbols 

rem correct 009 => 9, 021 => 21: 
IF %NUMBER:~0,1%;==0; SET NUMBER=%NUMBER:~1% 
IF %NUMBER:~0,1%;==0; SET NUMBER=%NUMBER:~1% 

rem receive addition 
SET /A BIGNUMBER = %NUMBER% + 250 

rem rename old filename to part_before_18,new_number,part_after_21 
ren %FN% %FN:~0,18%%BIGNUMBER%%FN:~21% 

rem exit "function" rename_to_increased_number 
exit /b 

:end 
+0

안녕하세요, 답변 해 주셔서 감사합니다. 나는이 예제에 사용하려고 : 1410141738545_f06t009v0003600000F.dat.gz 이름 출력 파일 그것은 그 이유를 알고,이 경우 숫자 009를 차단 1410141738545_f06tv0003600000F.dat.gz 입니까? – MarcaSolkanar

+0

답변을 편집하여 코드 작동 방식과 OP 문제를 해결하는 방법에 대한 설명을 추가하십시오. 많은 SO 포스터는 초보자이며 게시 한 코드를 이해하지 못합니다. –

+0

아래에 나열된 문제는 아래에 나열되어 있습니다. 1) 009라는 이름의 파일은 문자열에서 번호를 지 웁니다. 2) 008이라는 파일이 257 (258이 아님)이되었습니다. 3) 숫자가 010 인 파일 258 (260이 아님) 다른 파일 (001002003004005006007)은 .bat 파일이 정상적으로 작동합니다. – MarcaSolkanar

1

3 자리 숫자는 t 및 v, 어느 쪽도 아니 t도 V 사이에 항상이라고 가정하면, 당신이 필요로하는 모든 이전 이름에 나타납니다 :

@echo off 
setlocal enableDelayedExpansion 
for /f "tokens=1,2* delims=tTvV" %%A in (
    'dir /b /a-d ?????????????_???t0??v??????????F.dat.gz' 
) do (
    set /a "num=1%%B+250-1000" 
    ren "%%At%%Bv%%C" "%%At!num!v%%C" 
) 

위는 지난 가정 기본 이름의 문자는 항상 F입니다. 그렇지 않은 경우 다른 이름으로 대체 할 수 있습니까? F의 경우, 그러나 너무 짧은 이름과 일치 할 수 있습니다. 결과를 FINDSTR로 파이프하여 파일 마스크를보다 정확하게 만들 수 있습니다.

가장 큰 입력 번호가 010 인 것을 알고 있기 때문에 파일 마스크에서 첫 번째 숫자를 0으로 하드 코딩했습니다. 이렇게하면 반복적으로 번호에 250을 추가 할 필요없이 동일한 폴더에서 스크립트를 여러 번 실행하는 것이 안전합니다.

+0

수정 - 버그 수정 : 필요한 DIR/B 옵션을 추가했습니다. – dbenham

관련 문제