2013-12-19 27 views
4

假設我們有以下的目錄結構:「GET-childitem * -recurse」 下降一級目錄

~dir00 
    |-> dir10 
    |  |-> dir20 
    |   |-> file1.txt 
    |-> dir11 
     |-> file2.txt 

現在,假設〜dir00是當前目錄。我會期待這兩個命令
get-childitem * -recurse

get-childitem -recurse
產生相同的結果。但是,他們沒有。第二種行爲就是我所期望的。

我正在嘗試編寫一個小型工具庫供我們的腳本程序使用。我需要編寫的一個工具是複製和備份文件集的工具。作爲輸入,我得到了一些告訴我什麼是文件/目錄等的東西。複製。我無法知道用戶可以提供什麼。他們可能會提供諸如「*」的通配符,他們可能會提供文件名,他們可能會提供-recurse參數等等。輸入被送到get-childitem。當「路徑」只是「*」時,獲取兒童行爲的不一致性是一個大問題。爲什麼get-childitem在提供「*」的路徑和-recurse選項時突然丟棄第一級目錄? (請注意,它只能刪除第一級目錄。)有沒有什麼辦法可以防止這種奇怪的行爲?

現在,它變得更棒了。如果我們把一個文件放在根目錄下,那麼文件結構變成

~dir00 
    |-> dir10 
    |  |-> dir20 
    |   |-> file1.txt 
    |-> dir11 
    |  |-> file2.txt 
    |-> file3.txt 

然後這些目錄突然沒有被丟棄。要重現此操作,只需執行以下腳本:

cd $Env:temp 
mkdir dir00\dir10\dir20 | out-null 
cd dir00 
mkdir dir11 | out-null 
echo 'hello world 1'>dir10\dir20\file1.txt 
echo 'hello world 2'>dir11\file2.txt 
$list1 = get-childitem -recurse 
echo 'Results of get-childitem -recurse: ' 
$list1 
echo '' 
echo 'Number of items:' 
$list1.length 
echo '' 
$list2 = get-childitem * -recurse 
echo 'Results of get-childitem * -recurse: ' 
$list2 
echo '' 
echo 'Number of items:' 
$list2.length 
echo '' 
echo "hello world 3">file3.txt 
$list3 = get-childitem * -recurse 
echo 'Results of get-childitem * -recurse: ' 
$list3 
echo '' 
echo 'Number of items:' 
$list3.length 
echo '' 
+3

+1從我,好問題:) – nimizen

回答

1

對此異常行爲的一種可能的解決方法是將星號替換爲句點,從而指示Get-ChildItem CMDLet與當前目錄一起使用。這樣的事情:

$suppliedPath = "*" 
if($suppliedPath -eq "*"){ 
    $suppliedPath = $suppliedPath.replace("*", ".") 
} 
Get-ChildItem $suppliedPath -recurse 
+0

是的,這就是我已經在做的事情,但這是一種破解,而且還不清楚在其他情況下會出現類似的問題。我正在尋找/希望存在一些可以在get-childitem中設置的選項或標誌,這將強制它包含第一級目錄。感謝您花時間回覆。 –

+0

沒有可以設置的標誌; Get-ChildItem的[Technet](http://technet.microsoft.com/en-us/library/hh849800.aspx)上的示例描述了使用(*)作爲通配符的預期功能。您的方案沒有明確涵蓋,但我認爲從所提供的信息暗示您正在經歷的行爲不符合預期是合理的。也許就[Microsoft連接](http://connect.microsoft.com/PowerShell)提交錯誤報告? – nimizen

+0

完成:https://connect.microsoft.com/PowerShell/feedback/details/812178/get-childitem-sometimes-drops-first-level-directories –

6

這是因爲您輸入到Get-ChildItem的路徑不同。

當你執行:

Get-ChildItem -Recurse 

你的意思是一樣的:

Get-ChildItem -Path . -Recurse 

或被解釋爲:獲取子項 - 路徑開始於當前目錄(dir00)

執行時:

Get-ChildItem * -Recurse 

你用*表示遍歷目錄中的所有項目,將這些路徑提供給Get-ChildItme,然後遞歸遍歷這些項目。因此,被執行相應的命令是這樣的:

$items = Get-ChildItem * 
Get-ChildItem $items -Recurse 

其中一期工程出:

Get-ChildItem -Path ./dir10 -Recurse 
Get-ChildItem -Path ./dir11 -Recurse 

現在,你看到的是一個奇怪的例外(或可以被看作是一個bug)本行爲,只有在這種情況下,當您有一個僅包含文件夾和沒有文件的根目錄時纔會發生這種情況。如果您創建的dir00一個文件:

echo 'hello world 1'>test1.txt 

然後我們執行

Get-ChildItem * -Recurse 

它列出完全一樣Get-ChildItem -Recurse。所以只有當你的根目錄沒有文件,只有文件夾時,你纔會得到不同的結果。

+0

這聽起來是正確的,很好的答案;值得注意的是,DOS dir命令以不同的方式解釋這個輸入,因爲它返回所有包括第一級目錄(cmd/c dir */s)的所有內容。 – nimizen

+0

我同意這看起來很奇怪,可能是一個錯誤。 – nimizen

+0

Woops。剛剛注意到你的最終評論正是我剛剛對我的問題所做的修改。幾乎有道理,除了爲什麼當基本目錄中有文件時,第一級目錄突然重新加入?這種行爲非常不穩定,並且使編程變得不可能。 –