Запустите функцию для каждого элемента списка в powershell - PullRequest
3 голосов
/ 05 августа 2009

У меня есть каталог, полный пар файлов. Каждая пара файлов имеет одинаковые имена с расширениями mp3 и cdg (файлы караоке!). Я хотел бы использовать powershell, чтобы получить список всех отдельных имен файлов без расширений

Я дошел до:

dir -recurse -filter "*.mp3" | select-object Name | sort

Но я не могу понять, как передать каждое имя в [System.IO.Path] :: GetFileNameWithoutExtension

как бы я это сделал?

Ответы [ 4 ]

6 голосов
/ 05 августа 2009

Что вам нужно, так это фильтр for-each (%) (точно не уверен, что это фильтр или командлет, но он имеет такой же синтаксис использования).

Попробуйте следующее

dir -recurse -filter "*.mp3" | 
  %{ $_.Name } |
  %{ [IO::Path]::GetFileNameWithoutExtension($_) } |
  sort

РЕДАКТИРОВАТЬ Обновление

Я изменил свой ответ с "select-object Name" на "%{ $_.Name}". Первый по существу берет свойство Name из значения конвейера и создает новый объект с единственным свойством указанного имени со значением исходного объекта. Последний обработает каждое значение в конвейере и передаст результат выполнения $_.Name по конвейеру.

4 голосов
/ 05 августа 2009

dir -recurse -filter "* .mp3" | выберите @ {имя = 'имя'; выражение = {[System.IO.Path] :: GetFileNameWithoutExtension ($ _. Name)}} | сортировать

2 голосов
/ 07 августа 2009

Теперь, когда PowerShell v2 имеет RTMd, вы можете выбрать элемент BaseName:

dir -recurse -filter * .mp3 | выберите BaseName | сортировать

2 голосов
/ 05 августа 2009

Если вам не нравится вводить% {$ _. Foo} все время, как я, попробуйте Get-PropertyValue (псевдоним: gpv) из PSCX .

Больше размышлений для подходящего гика: http://richardberg.net/blog/?p=55

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