2010-02-09 72 views
0

我在獲取函數中的Get-ChildItem的過濾器參數時遇到問題。如果作爲參數傳遞給函數,PowerShell中的Get-ChildItem -Include/-Exclude不會過濾

下工作正常,並顯示文件的整個列表:

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參數,可能更靈活的方法之一是切換程序行爲,而不是傳遞整個過濾器字符串,而只是傳遞「deleteme.txt」字符串。

5

您開始進入Powershell 2.0代理函數可以提供幫助的區域。但是,除此之外,下面是PowerShell 2.0中的一個簡單方法,假設您需要的是-Include和-Recurse。實際上,我會推薦使用-Filter,而不是使用-Filter,坦率地說它會快很多(在我的一些測試中是4倍),因爲-filter使用由OS提供的文件系統過濾,而-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的將關鍵的(如遞歸)值映射到名爲遞歸的參數命令。

0

您可以使用Invoke-Expression來執行存儲在變量中的命令。例如:

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

Write-Host $files 

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

$file.name 
相關問題