簡體   English   中英

與 Get-ChildItem cmdlet 的 -Include 參數混淆

[英]Confused with -Include parameter of the Get-ChildItem cmdlet

從文檔:

-包括

僅檢索指定的項目。 此參數的值限定了 Path 參數。 輸入路徑元素或模式,例如“*.txt”。 允許使用通配符。

Include 參數僅在命令包含 Recurse 參數或路徑指向目錄內容時有效,例如 C:\\Windows*,其中通配符指定 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"

它什么都不返回,而沒有 -Include 我得到文件夾內容。 所以 -Include 絕對是“有效的”。 這里到底發生了什么? -Path 指定“c:\\test”,而 -Include 嘗試匹配此路徑。 由於“*.txt”與“test”不匹配,所以沒有返回。 但是看看這個:

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

它返回 a.txt、b.txt 和 c.txt 作為“*t”匹配“test”並匹配所有子項。

畢竟,即使現在知道 Include 是如何工作的,我也不明白什么時候使用它。 為什么我需要它查看子文件夾內部? 為什么要這么復雜?

您混淆了 -include 的使用。 -include 標志應用於路徑,而不是路徑的內容。 如果不使用遞歸標志,唯一有問題的路徑就是您指定的路徑。 這就是您給出的最后一個示例有效的原因,路徑c:\\test在路徑中有 at 並因此匹配"*t"

您可以通過嘗試以下操作來驗證這一點

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

這仍然會產生目錄中的所有孩子,但它不匹配他們的名字。

-include 對 recurse 參數更有效的原因是您最終將通配符應用於層次結構中的每個路徑。

試試 -filter 參數(它只支持一個擴展):

dir -filter *.txt

根據JaredPar 的回答,為了與 Get-ChildItem 進行模式匹配,您可以使用常見的 shell 通配符。

例如:

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

“?”在哪里? 是匹配任何一個字符的通配符或

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

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

這應該會讓你得到你正在尋找的“更簡單”的行為。

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

答案在命令的完整描述中 (Get-Help Get-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

來自 Stack Overflow 問題PowerShell Scripting - Get-ChildItem

我希望這有幫助 :-)

在路徑末尾包含\\*應該可以解決該問題

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

這應該從當前工作目錄( C:\\logfiles )返回 .log 文件

上面 Alex 的示例表明,還將返回一個名為 foo.log 的目錄。 當我嘗試時,它不是,但它是 6 年后的,這可能來自 PS 更新。

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

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

這應該排除設置了“目錄”模式的任何內容。

get-childitem -include 僅適用於路徑中的 -recursive 或通配符。 我認為這是一個錯誤 [認為它在 PS 6 中有所不同]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM