Я пишу быстрый скрипт PowerShell для замены всех периодов, кроме последнего экземпляра. EG:Заменить все, кроме последнего экземпляра символа
hello. this. is a file.name.doc
→ hello this is a filename.doc
До сих пор от другого поста я смог получить регулярное выражение, но он не работает с PowerShell:
\.(?=[^.]*\.)
В соответствии с https://www.regex101.com/, она соответствует только первое появление периода.
EDIT: В принципе, мне нужно применить это соответствие и заменить его на каталог с подкаталогами. До сих пор у меня есть это:
Get-ChildItem -Filter "*.*" | ForEach {
$_.BaseName.Replace('.','') + $_.Extension
}
Но это не на самом деле заменить детали, и я не думаю, что это рекурсивная.
Я попробовал несколько вариантов:
Get-Item -Filter "*.*" -Recurse |
Rename-Item -NewName {$_.BaseName.Replace(".","")}
, но я получаю сообщение об ошибке
источник и путь назначения должен отличаться
Обратите внимание, что PowerShell по умолчанию использует модификаторы 'g' и 'm'. Пожалуйста, добавьте их в поле модификатора на RegEx101.com ([пример] (https://www.regex101.com/r/wZ4vX7/1)) – TheMadTechnician
Ух ты .. это исправил его .. так что если бы я должен был соответствовать и заменить , будет ли/gm в кавычках с регулярным выражением? как в '-match '/ \. (? = [^.] * \.)/gm''? – user2883071
На стороне примечания, если это действительно для имен файлов, и вы работаете с объектом [FileInfo], используйте свойство BaseName, а не свойство Name, и оно автоматически исключает расширение. Итак, 'Get-Item C: \ Temp \ File.Name.txt | ForEach {$ _. BaseName.Replace ('.', '') + $ _. Extension}' будет выводить 'FileName.txt' – TheMadTechnician