
Может кто-нибудь подсказать, где я ошибаюсь? У меня есть некоторые имена файлов, которые содержат 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%