2012-10-24 84 views
2

我是Powershell的新手,需要一些幫助解決問題。我創建它返回與關於指南的相關信息的對象的函數:將兩個陣列與對象作爲值比較

DATE:2012年10月12日

COMPUTER:PC1

目錄:C:\ TEMP

FOLDERSIZE_IN_MB: 70

我循環瀏覽目錄以收集其大小信息並將其每週導出到CSV文件中。

這裏開始我的問題:

我想獲得有關Dir增長的一些信息。我開始編寫一個腳本,導入最舊和最新的CSV文件。

$data="C:\LOG\Data" 
$data= gci -path $data -filter "*.csv" 
$temp="" 
$old,[email protected]() 

foreach($item in $data){ 


    If((Get-Date $item.LastWriteTime -format ("ddMMyyyy")) -gt $temp){ 

     $new+= $item.FullName |Import-CSV -delimiter ";" 
    } 
    Elseif((Get-Date $item.LastWriteTime -format ("ddMMyyyy")) -lt $temp){ 
     $old+= $item.FullName |Import-CSV -delimiter ";" 
    } 

$temp=(Get-Date $item.LastWriteTime -format ("ddMMyyyy")) 
} 

我該如何比較兩個數組,以便在兩者中找到相同的目錄文件並用它們的大小進行調用?

我不知道如何檢查:

IF C:\ TEMP老和C:新\ TEMP然後callulate(1-(SIZEOLD/SITZENEW))* 100。

我會很高興地得到這樣的輸出:

日期:2012年10月12日

計算機:PC1

目錄:C:\ TEMP

FOLDERSIZE_IN_MB:80,5

GROWTH_SINCE_LAST_SCAN:15%

這就是我所做的解決我的問題,但我看起來不太穩定,我不知道如何將散列轉換回對象來將結果導入csv。

$舊= $舊|組對象項目 $新= $新|

$result1=compare $new $old -property Name -includeequal -passthru |WHERE {$_.Sideindicator -eq "=="} 
$result2=compare $old $new -property Name -includeequal -passthru |WHERE {$_.Sideindicator -eq "=="} 

for($i=0;$i -le $result1.count;$i++){ 

    if($result1[$i].Name -contains $result2[$i].Name){ 

     $Size2=($result2[$i].Group)| select-object -property FolderSize_in_MB 
     $Size1=($result1[$i].Group)| select-object -property FolderSize_in_MB  

      if(([int]$Size1.FolderSize_in_MB) -ne "0"){ 
       $growth=(1-(([int]$Size2.FolderSize_in_MB)/([int]$Size1.FolderSize_in_MB)))*100 
      } 
      else{ 
       $growth="0" 
      } 
     } 
    else{ 

    } 
    if($result1[$i]){ 

    $result1[$i].Group| ADD-Member NoteProperty Growth ("{0:n2}"-f $growth +"%") 


    } 
} 
+0

試試這個 - http://technet.microsoft.com/en-us/library/ee156812。aspx –

回答

0

最前進的道路將基於gci | measure-object -sum length組對象的項目。腳本專家們只有done it that way

對於自制解決方案,我寧願將目錄名稱和大小存儲在文件中。在下一次運行時,導入數據並在其內容上創建散列表。使用每個dir的全名作爲散列鍵和大小作爲值。閱讀當前的目錄大小並從哈希表中查找舊大小。 (你可以序列化哈希表,我可以這樣做。)

$ht = @{} 
$oldDirs = import-csv "lastStatus.log" # Assume: Name,Size 

$oldDirs | % { 
    $ht.Add($_.Name, $_.Size) 
} 

$newDirs = gci -path $data -filter "*.csv" 

$newDirs | % { 
    # If the hashtable contains dir with same name, read the size and print comparison 
    if($ht.ContainsKey($_.FullName)) { 
    $oldValue = $ht.Item($_.FullName) 
    $("{0}, {1}% " -f $_, (1-($oldValue/$_.Size))*100) # Get current size here somehow 
    } 
} 
+0

謝謝我會試試 – PointerNullException

+0

非常感謝! – PointerNullException