
내가 어디에서 잘못되고 있는지 조언해 줄 수 있는 사람이 있나요? 다음을 포함하는 일부 파일 이름이 있는데 XXX XXX_Layer_XXX
다음으로 바꾸려고 합니다.XXX XXX_Layer__XXX
지금까지 내 시도는 다음과 같습니다
ren "*Layer_*.*" "*Layer__*.*"
하지만 예상대로 작동하지 않는 것 같습니다!
답변1
내 이전 대답은 명령을 사용하려고 시도했지만 ren
실패했습니다. 이 명령은 매우 원시적인 문자열 일치만 수행하기 때문입니다. 가장 중요한 점은 문자열을 더 긴 문자열로 대체할 수 없다는 것입니다.
다른 사람들도 같은 실수를 저지르지 않도록 여기에 설명(답이 아님)이 있습니다.
명령이 다음과 같이 작성된 경우:
ren SourceMask TargetMask
그런 다음 문자가 있으면 TargetMask
포인터가
SourceMask
한 위치씩 앞으로 이동합니다.
1234.567
따라서 다음 명령을 사용하여 파일 이름을 바꾸는 경우 :
ren *2*.* *2X*.*
결과는 입니다 12X4.567
. 그럴 것이다~ 아니다순진하게 예상되는 일이 되십시오
12X34.567
.
그 이유는 TargetMask
여기에서 다음과 같이 처리되기 때문입니다.
*2 - matches up to and including 2, adding to target : 12
X - matches itself AND advances one position so skipping 3, adding to target : X
*. - matches up to and including the point, adding to target : 4.
* - matches the extension part, adding to target : 567
결론: ren
길이가 다른 문자열을 바꿀 때는 이 명령을 피해야 합니다.
작동 방식은 ren
게시물에 매우 완벽하게 설명되어 있습니다.
Windows RENAME 명령은 와일드카드를 어떻게 해석합니까?.
답변2
PowerShell에서는 훨씬 쉬울 것입니다.
Get-ChildItem *Layer_* | Rename-Item -NewName { $_.Name -creplace '_Layer_', '_Layer__' } -WhatIf
별칭 버전:
ls *Layer_* | ren -Ne { $_.Name -creplace '_Layer_', '_Layer__' } -wi
새 이름이 올바른지 확인한 후 제거 -WhatIf
/ -wi
실제 이름 바꾸기를 수행하십시오 .
cmd에서 rename
명령은 대상에서 욕심 많은 교체를 수행하므로 *
솔루션이 작동하지 않습니다. 보다Windows RENAME 명령은 와일드카드를 어떻게 해석합니까?. 문자열을 직접 교체해야 합니다. 이 같은
@echo off
setlocal enabledelayedexpansion
for %%d in (*_Layer_*) do (
set "name=%%d"
echo ren "!name!" "!name:_Layer_=_Layer__!"
)
교체품은 바로 이 부분입니다 !name:_Layer_=_Layer__!
. 구문은 다음과 같습니다%variablename:text_to_find=text_to_replace%