2016-06-14 219 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