2014-06-17 35 views
2

我想將列和值添加到從CSV生成的現有數組中。添加列並將值分配給現有數組

這是我的代碼:

$mycsv= "C:\Users\test\Documents\serveurs.csv" 
$servers = Import-CSV $mycsv 

這是結果:

ServerName        Ip                 
----------        --          
Castor         172.22.0.64        
Pollux         172.22.0.67 

我想和值添加新列每個服務器名稱,例如:

ServerName        Ip     Available             
----------        --     ---------    
Castor         172.22.0.64   Yes     
Pollux         172.22.0.67   No  

所以我試了下面的代碼:

$item = New-Object PSObject 
$item | Add-Member -type NoteProperty -Name 'Available' -Value 'Yes' 

$servers += $item 

但它實際上不工作,任何人都可以幫助我嗎?

最後的想法是使用Test-Connection Cmdlet,如果服務器可通過網絡或不通過網絡,則分配值。

謝謝

回答

6

你可以使用一個計算的屬性確定每個服務器的可用性:

$csv1 = 'C:\Users\test\Documents\serveurs.csv' 
$csv2 = 'C:\Users\test\Documents\serveurs2.csv' 

Import-Csv $csv1 | select ServerName, Ip, 
    @{n='Available';e={[bool](Test-Connection -Count 1 $_.Ip 2>$null)}} | 
    Export-Csv $csv2 -NoType 

注但是,即使將測試限制爲每個服務器的單個探測器,這可能需要一些時間,因爲所有項目都是按順序處理的。如果你有很多的服務器來測試的,你可能要爲並行作業運行檢查:

$csv = 'C:\Users\test\Documents\serveurs.csv' 

$servers = Import-Csv $csv 

# clear job queue 
Remove-Job * 
# load job queue with test jobs 
$servers | % { 
    Start-Job -ScriptBlock { 
    $args[0] 
    [bool](Test-Connection -Count 1 $args[0] 2>$null) 
    } -ArgumentList $_.Ip 
} 
# wait for jobs to finish 
Do { 
    Start-Sleep -Milliseconds 100 
} while (Get-Job -State 'Running') 

# gather job results into hashtable 
$availability = @{} 
Get-Job | % { 
    $result = Receive-Job -Id $_.Id 
    $availability[$result[0]] = $result[1] 
    Remove-Job -Id $_.Id 
} 

# add availability column to server data and export back to CSV 
$servers | select ServerName, Ip, @{n='Available';e={$availability[$_.Ip]}} | 
    Export-Csv $csv -NoType 
+0

比我的回答好得多,我需要仔細看看這個腳本,以便更多地瞭解哈希表和結構。你能解釋一下「e =」條款究竟是什麼? (在e = {$ availability [$ _。ip])?它只是從腳本表達中獲得價值,對吧? – Koliat

+0

@Koliat查看[TechNet上關於計算屬性的文章](http://technet.microsoft.com/en-us/library/ff730948.aspx)。 'e'是'Expression'的簡稱。 –

1

我不知道是否有在模塊中存在的構建操縱CSV文件。

您可以操縱CSV文件來爲您提供輸出或將NoteProperty添加到現有變量。

例1:

(cat "C:\Users\test\Documents\serveurs.csv") -replace "Servername;IP", "Servername;IP;Available" -replace "64","64;" -replace "67","67;" | out-file "C:\Users\test\Documents\serveurs.csv" 

例2:

$CSV | Add-Member -MemberType NoteProperty "Available" -Value "Yes" 

這應該理清您的需求,我想。

編輯:

由於議題明確,這裏是所提出的答案。

我敢肯定存在一個更簡單的方法來做到這一點,但它的工作原理反正

$CSV | Add-Member -MemberType NoteProperty "Available" -Value "" 
for ($i=0; $i -le $CSV.Length-1; $i++) {$CSV[$i].Available = Test-Connection $CSV[$i].Servername -quiet} 
+0

你的第二個例子正在工作,但它不是我想要的。因爲它實際上是將值「yes」分配給我的所有ServerName –

+0

我很抱歉,但您沒有指定* *完全想要的內容。您是否希望根據服務器是否可通過網絡訪問來分配值? – Koliat

+0

是的,我將使用Test-connection cmdlet。我知道如何使用它,但我想把最終結果放入我的數組(由我的csv生成)。我的問題是「如何將新列和新值賦給從csv生成的數組?」感謝您的幫助。 –

1

填充字段值不談,用於獲取附加屬性的另一種選擇是使用Select-對象。

$csv = 'C:\Users\test\Documents\serveurs.csv' 
$servers = Import-Csv $csv | select *,Availability 

然後填充可用性,但是您選擇。

如果您打算使用後臺作業進行多線程,我認爲您最好將服務器名稱分組爲組,並設置後臺作業以處理每個組。建立和拆除後臺作業需要大約5秒鐘的時間,並且使用它們執行簡單的任務(如ping單臺計算機)可能會產生相反的效果。

這是更多的代碼工作,但如果你想多線程,我認爲一個運行空間池產生的結果比在這個應用程序中的後臺作業快得多。