Использовать функцию переименования 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%

Связанный контент