2009-04-26 71 views
11

的-Include參數從技術文檔:困惑與Get-ChildItem cmdlet的

-Include

只檢索指定項。 此參數的值符合 Path參數。輸入路徑 元素或模式,例如「* .txt」。 允許使用通配符。

include參數是有效的,只有當該命令 包括Recurse參數或 路徑導致 目錄的內容,如C:\視窗*,其中 通配符指定的所述 內容C:\ Windows目錄。

我的第一個理解是:

c:\test\a.txt 
c:\test\b.txt 

因此,要獲得 'A.TXT' 和 'b.txt' 我可以這樣寫:

gci -Path "c:\test\*" -Include "*.txt" 

而這個工作。但現在考慮這樣的層次:

c:\test\a.txt 
c:\test\b.txt 
c:\test\c.txt\c.txt 

同樣的命令返回: A.TXT,b.txt,c.txt

實際的邏輯似乎是:

-Include使用以匹配由-Path指定的所有實體。如果匹配元素 是一個文件 - 返回它。如果匹配 元素是一個文件夾,看看裏面和 返回匹配的一級兒童。

同時,文檔說:

include參數是有效的,只有當命令 包括Recurse參數或 路徑導致 目錄的內容...

這也是錯誤的。例如。

gci -Path "c:\test" -Include "*.txt" 

它不返回任何內容,而不包含我包含的文件夾內容。所以 - 包括絕對是「有效的」。這裏真的發生了什麼? -Path指定「c:\ test」,並且-Include嘗試匹配此路徑。由於「* .txt」與「test」不匹配,所以沒有返回。但是看看這個:

gci -Path "c:\test" -Include "*t" 

它返回A.TXT,b.txt和c.txt爲「* T」匹配「測試」和匹配的所有子項。畢竟,即使知道包括現在的作品,我也不知道何時使用它。爲什麼我需要它看到子文件夾內?爲什麼它應該如此複雜?

回答

14

你很困惑使用-include。-include標誌應用於路徑,而不是路徑的內容。如果不使用遞歸標誌,那麼所討論的唯一路徑就是您指定的路徑。這就是爲什麼你給出的最後一個例子工作,路徑c:\test在路徑中有一個t,因此匹配"*t"

您可以嘗試以下

gci -path "c:\test" -in *e* 

這仍然會產生所有目錄中的孩子們的驗證這一點但它沒有匹配他們的名字。

之所以-include是遞歸參數更有效的是,你最終應用通配符對層次結構中的每一個路徑。

+0

我正在使用PowerShell-v2.0-CTP3,並且您的示例會生成空集。 – alex2k8 2009-04-26 17:21:02

+0

@ alex2k8,不知道該說些什麼。我已經在1.0和2.0以後的版本中試過這個例子,兩者都產生了相同的結果。 – JaredPar 2009-04-26 17:25:46

+0

@Jared,這很奇怪。請你可以試試gci -path c:\ * -in *。我看到c:\的子項目,並且所有子文件夾都是一級的。這裏是類似的描述http://www.eggheadcafe.com/software/aspnet/32624832/getchilditem-include-qu.aspx – alex2k8 2009-04-26 23:33:56

4

後跟蹤到JaredPar's answer,爲了做圖案的Get-ChildItem匹配,你可以使用普通的外殼通配符。

例如: 「?」

get-childitem "c:\test\t?st.txt" 

其中是匹配任何一個字符的通配符或

get-childitem "c:\test\*.txt" 

它將匹配以「.txt」結尾的任何文件名。

這應該得到你所尋找的「簡單」的行爲。

+0

這裏的問題不是你只能得到一個擴展嗎? -Include是字符串[],允許多個匹配變體。 謝謝,本 – 2009-09-02 21:29:37

9

嘗試篩選參數(它只有一個擴展支持):

DIR型濾波器* .TXT

+5

過濾器稍有不同,因爲它是提供程序特定的實現。它通常更高效,因爲它在數據返回之前發生。但是它對PowerShell中的每個驅動器提供者都有不同的實現。因此匹配算法可能會有細微的差異。 – JaredPar 2009-04-26 17:59:37

2

我剛纔問過類似的問題,並得到了有關Get-Help爲的Get-三個快速回復ChildItem。

答案是命令的完整描述 (獲取幫助獲取-ChildItem -full):

The Include parameter is effective only when the command includes the 

Recurse參數或路徑通向 一個目錄的內容,如 C:\ WINDOWS *,其中通配符 字符指定的 內容的C:\ Windows目錄。

所以下面將工作沒有 遞歸。

PS C:\ FOO> GET-childitem -path 「C:\ FOO *」 -Include * .TXT

從堆棧溢出問題PowerShell Scripting - Get-ChildItem

我希望這有助於:-)

0

在路徑的末尾包括\*應該解決的問題

PS C:\logfiles> Get-ChildItem .\* -include *.log 

這應返回。來自當前工作目錄的日誌文件(C:\logfiles

Alex的上面的示例表明還會返回名稱爲foo.log的目錄。當我嘗試它時,它不是,但它是6年後,可能來自PS更新。

但是,您可以使用子項Mode排除我認爲的目錄。

PS C:\logfiles> Get-Childitem .\* -include *.log | where-object {$_.mode -notmatch "d"} 

這應該排除任何與「目錄」模式設置。