폴더에 있는 수백 개의 이미지 이름을 바꾸려고 할 때 다음과 같은 문제가 발생했습니다(주어진 것이므로 영향을 줄 수는 없습니다).
모든 파일의 구조는 "이름{공백}접미사.JPG".
따라서 이미지는 동일할 수 있습니다 .이름, 그러나 이 경우에는 해당 항목으로 구별됩니다.접미사. 예:
L083192 (1).JPG
L083192 (2).JPG
L083192 (3).JPG
L083192 (4).JPG
또는
L081473 a.JPG
L081473 b.JPG
목표는 동일한 이름을 가진 모든 이미지에 카운터(접두사로)를 추가하는 것입니다. 즉
1_L083192 (1).JPG
1_L083192 (2).JPG
1_L083192 (3).JPG
1_L083192 (4).JPG
[..]
16_L081473 a.JPG
16_L081473 b.JPG
카운터는 어떤 이름이 동일한지 확인하는 "FOR /F" 루프에서 계산되므로 동일한 접두사를 가져야 합니다.
그러나 다음 REN 명령을 적용하여 카운터 접두사를 추가하려고 하면:
ren "%%h*" "!cnt!_%%h*"
문제가 생겼습니다.
( %%h and !cnt! are variables of the "FOR /F" loop
)
해당 출력은 다음과 같습니다.
L083192 (1).jpg >> 1_L0831921).jpg [i.e. " (" gone missing]
[..]
L083192 (4).jpg >> 1_L0831924).jpg [id.]
두 개의 "L081473" 파일은 심지어하나의출력 파일(접미사 없음)!
16_L081473.JPG
의심할 바 없이 dbenham이 그의 책에서 설명한 메커니즘과 연관성이 있습니다.REN(AME) 명령에 대한 광범위한 게시물, 그러나 프로세스에서 일부 중간 문자가 손실되는 대신 원본 파일 이름이 잘릴 것으로 예상하기 때문에 위의 경우에는 문제를 해결할 수 없습니다. REN
공백을 수용하기 위해 명령 에서 이러한 파일 이름을 인용했지만 원래 파일 이름의 공백이 이유일 수 있습니다 . 누구든지 설명할 수 있나요?
또한, REN
원하는 결과를 생성할 수 없는 것 같거나 생성할 수 있습니까? 일반 배치를 사용하여 원하는 결과를 어떻게 얻을 수 있습니까?
또한 또는 를 REN
사용하여 문제를 해결하려고 시도했지만 결과는 동일했습니다. 이 명령은 dbenham이 신중하게 제안한 것과 동일한 구성표를 적용하는 것으로 보입니다.COPY
XCOPY
같은 게시물에(참고 참조).
배치 파일
FOR /F %%h IN (input.txt) DO (
IF NOT "%%h" == "prev" (set /A cnt+=1)
[some more logic..]
cd Images
ren "%%h*" "!cnt!_%%h*"
cd..
[some more logic..]
set prev=%%h
)
메모:나는 파일 이름이 두 번 이상 바뀌는 것을 방지하는 추가 논리 배치를 제거했습니다. "input.txt"에는 접두사를 계산하는 데 충분한 이름만(즉, 접미사 없이) 나타나는 모든 항목이 포함됩니다. 샘플 파일을 제공할 수 있지만 이 메시지에 링크하는 방법을 찾지 못했습니다. 게다가 이름 변경을 복제할 수 없습니다(게다가 "Images" 폴더는 약 480MB입니다).
이 폴더의 전체 파일 이름은 파일 이름 변경을 기다리고 있는 하위 디렉터리 "Images"로 변경하여 고려됩니다. ( REN
현재 디렉토리에서만 작동)
답변1
내 RENAME 게시물에서 이 단락의 중요성을 놓치셨거나 인식하지 못하셨습니다.
모든 이름은 문자로 구분된 구성 요소로 나눌 수 있으며,
.
각 구성 요소의 끝에만 추가하거나 삭제할 수 있습니다.와일드카드로 나머지 부분을 유지하면서 구성 요소의 시작이나 중간에 문자를 삭제하거나 추가할 수 없습니다.. 대체는 어디에서나 허용됩니다.
와일드카드를 사용하여 기본 이름을 유지하면서 기본 이름의 시작 부분에 문자를 추가하려고 합니다. 위의 진술에 따르면 이것은 수행될 수 없습니다. 각 파일의 이름을 개별적으로 바꿔야 합니다. 이것은 특별히 어렵지 않습니다. 나는 당신의 다른 논리가 정확하다고 가정합니다.
FOR /F %%h IN (input.txt) DO (
IF NOT "%%h" == "prev" (set /A cnt+=1)
[some more logic..]
cd Images
for %%F in ("%%h*") do ren "%%F" "!cnt!_%%F"
cd..
[some more logic..]
set prev=%%h
)
지연된 확장이 활성화되어 %%F
포함된 경우 코드가 실패합니다 . !
이는 좀 더 많은 코드로 해결될 수 있습니다. 지연된 확장을 비활성화한 상태로 시작한 다음 필요에 따라 일시적으로 활성화하는 것이 좋습니다.
setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
endlocal
for %%F in ("%%h*") do ren "%%F" "%%N_%%F"
)