2016-06-14 179 views
0

我的腳本輸出任何託管網站的文本文件。該文本文件看起來像下面這樣:從文本文件創建CSV文件

Default 
Settings 
Layouts 
Stackexchangelogon

我需要這些成CSV與下列頭文件:

  • 類型
  • 基地
  • 狀態

對於Type,我需要網站名稱,Base,我需要IIS和Status,我需要監視。

最後的輸出會是這樣的,

Type     Base   Status 
Default    IIS   Monitored 
Settings    IIS   Monitored 
Layouts    IIS   Monitored 
Stackexchangelogon IIS   Monitored

我已經在網上搜索,並就如何實現這一目標仍然不解。由於Windows 2003主機,它需要在PowerShell 2.0上運行。

這是我迄今爲止 -

$website = Get-content "D:\Websites.txt" 

$CSV = @() 
$row = New-Object System.Object 
$website | ForEach-Object { 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Type" -Value $_ 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Base" -Value "IIS" 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Status" -Value "Monitored" 

    $CSV += $row 
} 

但它不是添加每個網站。我重複列表中的最後一個。結果:

Type       Base       Status 
----       ----       ------ 
Stackexchangelogon   IIS       Monitored 
Stackexchangelogon   IIS       Monitored 
Stackexchangelogon   IIS       Monitored 
Stackexchangelogon   IIS       Monitored

任何想法?

回答

1

在你的問題中的代碼,因爲你的循環之外創建$row,只是修改內環路這一個對象不起作用。 $CSV += $row然後將參考附加到數組的對象。因爲你的數組充滿了對同一個對象的引用,並且輸出顯示了循環後這個單個對象的最終狀態。

有幾種方法來避免這種情況,例如通過在每次迭代創建一個新的對象(如你在your own answer做的),或者通過附加對象的克隆到數組:

$CSV += $row.PSObject.Copy() 

但是,這兩種方法都不是最佳的,因爲它們沒有正確使用管線。您的代碼可以通過使用calculated properties進行簡化:

Get-Content 'D:\Websites.txt' | 
    Select-Object @{n='Type';e={$_}}, @{n='Base';e={'IIS'}}, 
        @{n='Status';e={'Monitored'}} | 
    Export-Csv 'D:\test.csv' -NoType 
0

使用解決 -

$website = Get-content "D:\Websites.txt" 

$CSV = @() 
$website | ForEach-Object { 
    $row = New-Object System.Object 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Type" -Value $_ 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Base" -Value "IIS" 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Status" -Value "Monitored" 

    $CSV += $row 
} 

$CSV | Export-Csv "d:\test.csv" -NoTypeInformation