배치 스크립트를 사용하여 재귀 적으로 파일, 폴더 및 하위 폴더 이름 바꾸기 ENABLEDELAYEDEXPANSION SET old=V1 SET new=newdocV2 for /f “tokens=*”

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET old=V1
SET new=newdocV2
for /f "tokens=*" %%f in ('dir /b *.ods') do (
  SET newname=%%f
  SET newname=!newname:%old%=%new%!
  move "%%f" "!newname!"
)

위의 코드는 파일이나 폴더의 이름 만 바꾸기 위해 작동합니다.

파일과 폴더의 이름을 재귀 적으로 바꾸려면 코드가 필요합니다.



답변

게시 한 코드가 파일과 폴더의 이름을 바꿉니다. 그러나 재귀 적으로 폴더 내의 파일 및 폴더의 이름을 바꿉니다.

DIR 마스크에 확장명이 있고 폴더 이름에 일반적으로 확장명이 없으므로 폴더가 아닌 파일의 이름을 바꿀뿐입니다. 이 경우 DIR을 추가하기 만하면됩니다. /S 옵션을 사용하여 하위 폴더로 /A-D 폴더 제외 옵션 newname은 경로 이름을 무시하고 파일 이름만으로 설정해야합니다. %%nxF. 그리고 MOVE 명령은 목적지 경로가 필요합니다. %%dpF. 이것은 일반적으로 효과가있는 해결책을 제공 할 것이지만, 합병증이있을 수 있습니다 (자세한 내용은 나중에 설명합니다).

@echo off
setlocal enableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s /a-d *.ods') do (
  set "newname=%%~nxF"
  set "newname=!newname:%old%=%new%!"
  move "%%F" "%%~dpF!newname!"
)

하나의 패스에서 파일과 폴더의 이름을 모두 바꾸려면 분명히
/A-D 선택권. 그러나 DIR 명령의 결과를 정렬하여 자식이 부모보다 먼저 처리되도록해야합니다. 그렇지 않으면 나열된 경로가 더 이상 유효하지 않기 때문에 자식 이름이 변경되지 않습니다.

@echo off
setlocal enableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s *.ods ^| sort /r') do (
  set "newname=%%~nxF"
  set "newname=!newname:%old%=%new%!"
  move "%%F" "%%~dpF!newname!"
)

이제 잘못 될 수있는 문제와 해결 방법 및 기타 개선 사항이 있습니다.

1) 파일 또는 폴더 이름에 ! 문자 (희귀하지만 가능). 지연 확장이 사용되는 동안 FOR 변수를 확장하면 포함 된 값이 손상됩니다 !. 해결 방법은 지연된 확장을 루프 내에서 켜고 끄는 것입니다.

2) 파일 A의 새 이름은 파일 B의 기존 이름과 일치 할 수 있으며 MOVE 명령은 B를 A로 겹쳐 쓰게됩니다. 최종 결과는 두 개가 있기 전의 하나의 파일입니다. 이것은 아마도 나쁜 것입니다. 해결 방법은 MOVE 대신 REN 명령을 사용하는 것입니다. 이 경우 이름 바꾸기가 실패하고 좋은 일이라고 생각합니다. REN 명령에 새 이름이 필요합니다. 없이 목적지 패스.

3) 아마도 파일 / 폴더의 이름이 바뀐 방법 목록을 원할 것입니다. 오류가 발생하면 특히 이름 변경에 실패한 것을 정확히 볼 수 있습니다. 간단한 해결책은 명령을 실행하기 전에 명령을 ECHO하는 것입니다.

4) 새 이름이 이전 이름과 일치하면 이름 바꾸기 동작을 수행 할 필요가 없습니다. 이것은 IF 조건을 추가하여 수행됩니다.

@echo off
setlocal disableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s *.ods ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  )
  endlocal
)

여전히 잠재적 인 문제가 있습니다. 예를 들어, 배치에는 = 변수 값 내의 문자. 이 문제는 순수한 배치로 해결하기가 어렵습니다.

당신이 단순히 내 인생을 사용하면 인생은 훨씬 간단 해집니다. JREN.BAT 유틸리티 – 정규 표현식을 사용하여 파일이나 폴더의 이름을 바꾸는 하이브리드 JScript / 배치 스크립트. JREN.BAT는 XP 이후의 모든 Windows 시스템에서 기본적으로 실행되는 순수한 스크립트입니다. 를 통해 전체 문서를 볼 수 있습니다. JREN /?. 당신은
JREN /?|MORE,하지만 내 콘솔 창을 이전 줄을 볼 수 있도록 스크롤 할 수 있도록 큰 버퍼로 구성되어 있으므로 더 이상 필요하지 않습니다.

이 도구를 사용하려면 정규 표현식을 이해해야합니다. 이 경우에는 문제가되지 않지만 검색어에 정규 표현식 메타 문자가 포함 된 경우 올바른 문자 해석을 얻으려면 이스케이프 처리해야합니다. 그러나 정규 표현식의 힘은 놀라운 것입니다. 변경 사항이 무엇인지 정확하게 설명 할 수 있습니다.

나는 /I 옵션을 사용하여 대 / 소문자 구분없이 검색 할 수 있습니다.

JREN.BAT는 파일의 이름 만 바꿉니다. 또는 두 파일의 이름을 바꾸려면 두 개의 명령이 필요합니다.

jren "V1" "newdocV2" /i /s /fm "*.ods"
jren "V1" "newdocV2" /i /s /fm "*.ods" /d

JREN은 일괄 처리 스크립트이므로, CALL JREN 위의 명령을 다른 배치 스크립트에 넣으면됩니다.


답변

여기에 내 코드가 성공적으로 폴더 및 파일의 이름을 바꿀 성공적으로 일하고 있습니다. 나는 파일 내부의 내용을 바꾸고 싶습니다.

다음은 폴더와 파일의 이름을 바꿀 때 사용하는 배치 파일 스크립트입니다.

@echo off
setlocal disableDelayedExpansion
set "old=V21"
set "new=V22"
for /f "delims=" %%F in ('dir /b /s *. *.ods ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  )
  endlocal
)

답변

아래 코드를 사용하여 폴더 및 파일의 이름을 V31에서 V32로 변경했지만 아래 코드로 V31에서 V32로 xml 파일을 변경할 수 없습니다.

@echo off
setlocal disableDelayedExpansion
set "old=V31"
set "new=V32"
for /f "delims=" %%F in ('dir /b /s *. *.xslt ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  ) )

for /f "delims=" %%i in (%xsltfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%old%=%new%!"
    echo(!line!
    endlocal
))>"%newfile%"
del %textfile%
rename %newfile%  %xsltfile%

  )
)

  endlocal
)

답변

아래 코드를 사용하면 폴더와 파일의 이름을 V31에서 V32로 바꿀 수 있지만 아래 코드로 XML 파일을 V31에서 V32로 변경할 수 없습니다.

@echo off
setlocal disableDelayedExpansion
set "old=V31"
set "new=V32"
for /f "delims=" %%F in ('dir /b /s *. *.xslt ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  ) )

for /f "delims=" %%i in (%xsltfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%old%=%new%!"
    echo(!line!
    endlocal
))>"%newfile%"
del %textfile%
rename %newfile%  %xsltfile%

  )
)

  endlocal
)