Переименование пакетного файла Windows PowerShell

В настоящее время я вручную просматриваю каждый файл и обновляю его, используя общую процедуру переименования.
Я только начинаю пытаться понять, как использовать Windows PowerShell для переименования группы файлов с общей структурой. Проблема в том, что все примеры, которые я видел, используют общее расширение для замены чего-либо. Я хочу удалить все после расширения и получаю ошибки.

Примеры:

[email protected]_BATCHES.20150108073838322
[email protected]_BATCHES.20150108073534804

Что бы я хотел, чтобы это закончилось так:

64244350.NSFM3V
64244882.NSFM3V

.NSFM3V является общим фактором во ВСЕХ файлах, но есть случайность до и после. Вот моя первая попытка создать что-то в PowerShell:

Get-ChildItem *.NSFM3V* | Rename-Item -NewName {$_name -Replace *.{$_name}.*,""}

Мой Get-ChildItem .NSFM3V работает при захвате всех файлов из папки, но я не могу заставить его переименовать.

Спасибо за ваше время!


person Tandar    schedule 08.01.2015    source источник


Ответы (2)


Вы можете сделать это следующим образом:

gci *.NSFM3V* | rename-item -newname { $_.name -replace '(.*)@.*', '$1' }

Используйте регулярное выражение, чтобы получить левую часть @ и использовать ее в замене.

Объяснение:

  • Любое совпадение из gci передается в конвейер, передаваемому объекту присваивается специальная переменная $_
  • Rename-Item берет объект $_ из конвейера и использует подстановку внутри {..} для создания нового имени.
  • Регулярное выражение внутри -replace принимает свойство name объекта и применяет замену
  • (.*) означает соответствие всем. Обратите внимание на скобки, они важны, так как образуют группу захвата.
  • @.* означает соответствие @, за которым следует что угодно
  • это означает, что при объединении захватить что-либо до @, за которым следует что-либо
  • '$1' — это ссылка на группу захвата, поэтому, по сути, вы заменяете все значение $_.name всем до (последнего) @ и передаете это параметру -NewName
person arco444    schedule 08.01.2015
comment
Это отлично работает! Благодарю вас! Не могли бы вы объяснить это немного? Я хотел бы понять, если мне нужно настроить его для других файлов. $_.name правильно принимает текущий GetChildItem? а затем заменяет текст с помощью команд после? Не уверен, как интерпретировать следующую часть '(.*)@.*', '$1' } - person Tandar; 08.01.2015
comment
Потрясающий. Пожалуйста, примите ответ, если вы нашли его полезным. - person arco444; 08.01.2015
comment
Хотите знать, можете ли вы перепроверить мой комментарий и дать некоторое представление, когда у вас будет такая возможность? Спасибо! - person Tandar; 08.01.2015
comment
Хотел бы я, чтобы у меня было больше репутации, чтобы я мог поднять тебя немного! Спасибо, это очень помогает - person Tandar; 08.01.2015

Простой альтернативный подход без использования подхода регулярных выражений, который часто сложно читать/понимать.

Get-ChildItem *.NSFM3V* | Rename-Item -NewName {($_.Name -split "@")[0]}

Ура, ГЖ

person gbabu    schedule 08.01.2015
comment
Не могли бы вы немного объяснить, как работает часть {($_.Name -split @)[0]}? - person Tandar; 08.01.2015
comment
Мы используем -split для разделения объекта $_.name с разделителем @. Итак, ваше имя файла теперь разделено на две части 64244882.NSFM3V и .NO_BATCHES.20150108073534804. Поскольку нас интересует только первая часть, мы используем индекс массива, который равен [0] (в PS индекс всегда начинается с 0). Надеюсь это поможет. Вы можете узнать больше о методах разделения в справке powershell help about_split - person gbabu; 09.01.2015