2015-07-03 150 views
0

我想用PowerShell腳本比較2個給定文件夾的子文件夾中的文件數量,但有些內容不起作用。比較子文件夾中的文件數量

我通過用戶輸入得到了2個文件夾的路徑並將其保存到 變量$where1$where2,我還保存在腳本開始進入可變$a的位置。我更改爲給出的文件夾以獲取有關其中的子文件夾的信息到2個數組中,一個有數字的$folderArrayX(如$folderArrayX["subfolder1"]=xx是子文件夾1的子項的數量)),另一個只是子文件夾的名稱更容易比較。給出的第一個文件夾的代碼:

cd $where1; 
$folderArray1 = @(); 
$folderArray1Keys = @(); 
Get-Childitem | Select-Object | ForEach-Object { 
    if ($_.PSIsContainer) { 
    $ArrayInArray = @{}; 
    $folderArray1Keys += $_.Name.Trim(); 
    $ArrayInArray[$_.Name.Trim()] = (Get-ChildItem ./$_).count; 
    $folderArray1 += $ArrayInArray; 
    } 
} 

我爲$where2一樣的,所以我得到$folderArray2$folderArray2Keys

我們比較這些2:

$r=() #something to save the returns 
Compare-Object $folderArray1Keys $folderArray2Keys -IncludeEqual | ForEach-Object { 
    if ($_.SideIndicator -eq "=>") { 
     $r += ""+$_.InputObect+" only "+$where2+" : "+$folderArray2[$_.InputObject]+" files"; 
    } elseif ($_.SideIndicator -eq "<=") { 
     $r += ""+$_.InputObect+" only "+$where1+" : "+$folderArray1[$_.InputObject]+" files"; 
    } else { 
    if ($folderArray1[$_.InputObject] -gt $folderArray2[$_.InputObject]) { 
     $dif = ($folderArray1[$_.InputObject]-$folderArray2[$_.InputObject]) 
     $r += "on both sides"+$_.InputObject+" has "+$diff+" more files in "+$where1 
    } elseif ($folderArray2[$_.InputObject] -gt $folderArray1[$_.InputObject]) { 
     $dif = ($folderArray2[$_.InputObject]-$folderArray1[$_.InputObject]) 
     $r += "on both sides"+$_.InputObject+" has "+$diff+" more files in "+$where2 
    } else { 
     $r += ""+$_.InputObject+" is equal on both sides"; 
    } 
    } 
} 
#Output 
$r 
cd $a 

一些如何驗證碼不能很好地工作。它表明子文件夾是平等的,顯然不是(只是因爲他們在那裏,完全忽略了這些數字),不要拼寫出所有的文件夾(我最不理解的是(它對雙面文件夾都這樣做)),也不要顯示任何數字。我想不通的錯誤,因爲assiocated陣列PowerShell的工作,我的意思是像這樣的代碼:

$k1="key1"; 
$v1=1; 
$k2="key2"; 
$v2="value2"; 
[email protected]{}; 
$array[$k1]=$v1; 
$array[$k2]=$v2; 
$array[$k1] 
$array[$k2] 
pause 
# Exert 
# 1 
# value2 
# Press any key to continue ... 

按預期工作。

回答

1

您的比較例程將$folderArray1$folderArray2視爲哈希表,但您將它們定義爲哈希表數組。基本上,你這樣做:

PS C:\>$h = @{} 
PS C:\>$h['foo'] = 42 
PS C:\>$a = @() 
PS C:\>$a += $h 
PS C:\>$a['foo'] 
PS C:\>$a[0]['foo'] 
42

當你真正想只是這樣的:

PS C:\>$a = @{} 
PS C:\>$a['foo'] = 42 
PS C:\>$a['foo'] 
42

更改用於填充$folderArray變量此代碼:

$folderArray = @{} 
Get-Childitem | ? { $_.PSIsContainer } | ForEach-Object { 
    $folderArray[$_.Name] = @(Get-ChildItem $_.FullName).Count 
} 

Compare-Object對此的陳述:

Compare-Object @($folderArray1.Keys) @($folderArray2.Keys) -IncludeEqual | ... 

問題應該消失。

+0

它的工作,仍然是把Arraykeys放在他們自己的數組中更好的方法。此代碼:$ a = @ {}; $ a [「k1」] =「v1」; $ a [「k2」] =「v2」; $ b = @ {}; $ b [「k2」] =「v2」; $ b [「k3」] =「v3」; 比較對象$ a.Keys $ b.Keys -IncludeEqual;將產生這個輸出:InputObject {k3,k2} {k2,k1}; SideIndicator =><=,它只是表明鍵是不同的。 Duh – user3284214

+0

@ user3284214密鑰集合必須轉換爲數組。查看更新的答案。 –

+0

謝謝,但我的代碼現在運行良好。最後一個問題:您使用$ _。Name作爲Keys,但$ _。FullName,有區別嗎?它似乎只爲我使用$ _。Name。 – user3284214

相關問題