Powershell заменяет строку типа "-anything_" на "_" - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь заменить строку в именах моих файлов.Строка всегда начинается с «-» и заканчивается «_».Середина может быть числами, текстом или обоими.

Я успешно изменил «-» на «», но регулярное выражение убивает меня.Я полный новичок, поэтому весь этот код собран из других статей.

$baseDirectory = "C:\Test\Rename\"
$a = "\-(.*?)\_"
$b = "_"

$Include = '*.jpg'

Pushd $baseDirectory

Get-ChildItem -Filter "*$a*" -Recurse|
  Rename-Item -NewName {$_.Name -replace $a,$b} -ErrorAction SilentlyContinue

PopD

Цель A121000-22_01.jpg -> A121000_01.jpgA478BFE-876_02.jpg -> A478BFE_02.jpgA124568-59B_03.jpg -> A124568_03.jpg

Результат без изменений.

1 Ответ

1 голос
/ 03 апреля 2019

Ваше существующее регулярное выражение очень близко.Нет необходимости заменять на _.

Опция 1

Вы можете изменить ленивый квантификатор (.*?) на класс исключений символов [^_]*, как можно увидеть здесь .

-[^_]*

Это соответствует:

  • - этот символ буквально.
  • [^_]* любой символ, кроме _ любое количество раз(это останавливается, когда оно достигает _).

Опция 2

Если вам нужно убедиться, что символ _ существует, тогда вы можете использовать следующее здесь (обратите внимание, что последняя строка не соответствует).

-[^_]*(?=_)

Это соответствует:

  • - этот символ буквально.
  • [^_]* любой символ, кроме _ любое количество раз (останавливается, когда достигает _).
  • (?=_) гарантирует, что следующий символ _ буквально

Дополнительно

Я изменил ваш код на следующий, и он работал для меня (заменил -Filter "*$a*" на -Include "*.jpg"):

$baseDirectory = "C:\test\Rename"
$a = "-[^_]*(?=_)"

Pushd $baseDirectory

Get-ChildItem -Include "*.jpg" -Recurse|
  Rename-Item -NewName {$_.Name -replace $a,""} -ErrorAction SilentlyContinue

PopD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...