2016-06-14 5 views
0

Mein Skript gibt eine Textdatei aller gehosteten Websites aus. Die Textdatei würde wie folgt aussehen:Erstellen Sie eine CSV-Datei aus der Textdatei

Default 
Settings 
Layouts 
Stackexchangelogon

ich mit den folgenden Header erhalten müssen diese in eine CSV-Datei:

  • Typ
  • Basis
  • Der Status

Für Type, brauche ich Website-Name, Base, ich brauche es, um IIS zu haben und für Status muss ich überwacht haben.

Die endgültige Ausgabe wäre so etwas wie,

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

Ich habe das Web durchsucht und immer noch verwirrt darüber, wie dies zu erreichen. Es muss mit PowerShell 2.0 aufgrund von Windows 2003-Hosts funktionieren. Diese

ist das, was ich bisher -

$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 
} 

Aber nicht jede Website hinzuzufügen. Ich bekomme Wiederholungen von dem letzten auf der Liste. Ergebnis:

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

Irgendwelche Ideen?

Antwort

1

Der Code in Ihrer Frage nicht funktioniert, weil Sie $row außerhalb der Schleife erstellen und nur innerhalb der Schleife dieses ein Objekt ändern. $CSV += $row fügt dann eine Referenz an das Objekt an das Array an. Aus diesem Grund ist Ihr Array mit Referenzen auf dasselbe Objekt gefüllt, und die Ausgabe zeigt den Endzustand dieses einzelnen Objekts nach der Schleife an.

Es gibt mehr Möglichkeiten, dies zum Beispiel zu vermeiden, indem ein neues Objekt mit jeder Iteration zu schaffen (wie Sie in your own answer tun) oder durch einen Klon des Objekts an das Array angehängt:

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

Beide Ansätze sind jedoch suboptimal, da sie die Pipeline nicht richtig nutzen. Ihr Code könnte durch die Verwendung von 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 
ein wenig gestrafft werden
0

mit Geklärt -

$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