Ваше существующее регулярное выражение очень близко.Нет необходимости заменять на _
.
Опция 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