2015-12-18 3 views
1

Я пишу быстрый скрипт PowerShell для замены всех периодов, кроме последнего экземпляра. EG:Заменить все, кроме последнего экземпляра символа

hello. this. is a file.name.dochello 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(".","")} 

, но я получаю сообщение об ошибке

источник и путь назначения должен отличаться

+3

Обратите внимание, что PowerShell по умолчанию использует модификаторы 'g' и 'm'. Пожалуйста, добавьте их в поле модификатора на RegEx101.com ([пример] (https://www.regex101.com/r/wZ4vX7/1)) – TheMadTechnician

+0

Ух ты .. это исправил его .. так что если бы я должен был соответствовать и заменить , будет ли/gm в кавычках с регулярным выражением? как в '-match '/ \. (? = [^.] * \.)/gm''? – user2883071

+1

На стороне примечания, если это действительно для имен файлов, и вы работаете с объектом [FileInfo], используйте свойство BaseName, а не свойство Name, и оно автоматически исключает расширение. Итак, 'Get-Item C: \ Temp \ File.Name.txt | ForEach {$ _. BaseName.Replace ('.', '') + $ _. Extension}' будет выводить 'FileName.txt' – TheMadTechnician

ответ

0

Исключить файлы, которые не имеют период в их базовом имени от переименования:

Get-ChildItem -File -Recurse | Where-Object { $_.BaseName -like '*.*' } | 
    Rename-Item -NewName {$_.BaseName.Replace('.', '') + $_.Extension} 
Смежные вопросы