Windows 이름 바꾸기를 사용하여 단일 밑줄을 이중으로 바꾸시겠습니까?

Windows 이름 바꾸기를 사용하여 단일 밑줄을 이중으로 바꾸시겠습니까?

내가 어디에서 잘못되고 있는지 조언해 줄 수 있는 사람이 있나요? 다음을 포함하는 일부 파일 이름이 있는데 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%

관련 정보