2010-02-09 3 views
0

У меня проблема с получением аргумента фильтра Get-ChildItem в функции.'Get-ChildItem -Include/-Exclude' в PowerShell не фильтрует, если передан как аргумент функции

Следующие работает отлично и отображает весь список файлов:

c:\temp\Get-ChildItem -Include *deleteme*.txt -Recurse 

Теперь у меня есть следующий сценарий

#file starts here 
#filename = GetLastFile.ps1 

param([string] $filter) 

$files = Get-ChildItem $filter 

Write-Host $files #should print all matching files but prints nothing 

$file = $files | Select-Object -Last 1; 


$file.name #returns filename 
#File ends here 

Теперь пытается запустить сценарий,

c:\temp.\GetLastFile.ps1 "-Include *deleteme*.txt -Recurse" 

ничего не возвращает.

Поставка фильтра, *.*, отлично работает. Кажется, что он неисправен из-за -Include или -Exclude. Есть идеи?

ответ

0

Я считаю, что ваш параметр $ filter рассматривается как один строковый аргумент команды Get-ChildItem. Таким образом, если у вас нет каталога с именем «-Include deleteme.txt -Recurse», команда всегда ничего не возвращает.

Что касается фиксации вашей проблемы, ну, есть множество способов, которыми вы могли бы приблизиться к ней. Вероятно, одним из наиболее универсальных способов является изменение поведения программы, если передан аргумент $ filter, и вместо передачи всей строки фильтра просто передайте строку «deleteeme.txt».

5

Вы начинаете попадать в область, где могут помочь функции прокси-сервера Powershell 2.0. Однако, вкратце, вот простой способ в PowerShell 2.0 сделать это, предполагая, что все, что вам нужно, - Include и -Recurse. На самом деле, я бы рекомендовал использовать -Filter вместо этого, он будет делать то, что вы хотите, и, откровенно говоря, это довольно быстро (4 раза на некоторых моих тестах), потому что -filter использует фильтрацию файловой системы, предоставляемую ОС, тогда как -include обрабатывается PowerShell.

param([string]$Filter, [switch]$Recurse) 

$files = Get-ChildItem @PSBoundParameters 

Write-Host $files #should print all matching files but prints nothing 

$file = $files | Select-Object -Last 1; 

$file.name #returns filename 

@ символ используется для «знак» массив или хэш-таблицы через параметры на команду. Переменная $ PSBoundParameters - это автоматическая переменная, новая для PowerShell 2.0, которая определена в функциях. Это Хеш, который содержит все ограниченные (с именем и позиционной) параметры, например:

PS> function foo($Name,$LName,[switch]$Recurse) { $PSBoundParameters } 
PS> foo -Name Keith Hill -Recurse 

Key               Value 
---               ----- 
Name              Keith 
Recurse              True 
LName              Hill 

Когда вы восклицательный знак хэш-таблицу, как это против команды, PowerShell будет карту (например, Recurse) ценность ключа для параметра с именем Recurse на команда.

0

Вы можете использовать Invoke-Expression для выполнения команды, хранящейся в переменной. Например:

param([string] $filter) 
$files = Invoke-Expression "Get-ChildItem $filter" 

Write-Host $files 

$file = $files | Select-Object -Last 1 

$file.name