2017-05-31 7 views
0

Ich habe nur Probleme beim Exportieren der folgenden in eine CSV, ich habe versucht, die Export-CSV innerhalb der Foreach-Object Schleife vergebens.Powershell Export-CSV

Ich möchte den Server-Namen $server in der ersten Spalte und die Beschreibung $description in der zweiten Spalte setzen.

In einer früheren Version konnte ich eine Textdatei mit Out-File -append .\outa.txt -InputObject $_.Name,$description erstellen, aber die Formatierung funktionierte nicht gut.

$server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 
$server | ForEach-Object { 
    $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$_.Name) 
    $RegKey = $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters") 
    $description = $RegKey.GetValue("srvcomment") 
} | Export-Csv .\out1.csv 

Antwort

1

A ForEach als widersetzen, ForEach-Object:

$server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 

foreach($s in $server){ 

    # replaced $_ with $s 
    $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$s.Name) 
    $RegKey= $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters") 
    $description = $RegKey.GetValue("srvcomment") 

    # casting as array is required to use += 
    # disclaimer: the array is destroyed and rebuilt on each run. 
    [array]$myData += New-Object psobject -Property @{ 
     Server  = $s.Name 
     Description = $description 
    } 
} 

# If you want a CSV without the top info line, use the notypeinfo switch 
# Select-Object gives you the column order you want. 
$myData | Select-Object Server,Description | Export-Csv .\out1.csv -NoTypeInformation 

Bearbeiten - Kommentar Antwort
Es ist möglich, es zu tun, ohne einen Array und aus dem Innern der Schleife zu schaffen, sondern ein Objekt erforderlich ist von Export-Csv AFAIK.

ForEach-Object:

$server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 
$server | ForEach-Object { 
    $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$_.Name) 
    $RegKey = $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters") 
    New-object psobject -Property @{Server=$_.Name;Description=$RegKey.GetValue("srvcomment")} | Export-Csv .\out1.csv -NoTypeInformation 
} 

ForEach:

$server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 
foreach($s in $server){ 
    $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$s.Name) 
    $RegKey= $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters") 
    New-object psobject -Property @{Server=$s.Name;Description=$RegKey.GetValue("srvcomment")} | Export-Csv .\out1.csv -NoTypeInformation 
} 

Wenn Sie Probleme mit den Werten, Klammern/Unterausdrücke haben helfen können:

New-object psobject -Property @{Server=($_.Name);Description=($RegKey.GetValue("srvcomment"))} | Export-Csv .\out1.csv -NoTypeInformation 
New-object psobject -Property @{Server=$($_.Name);Description=$($RegKey.GetValue("srvcomment"))} | Export-Csv .\out1.csv -NoTypeInformation 
+0

Das funktioniert für mich danke. Ist es möglich, dies zu tun, ohne ein Array zu erstellen? Scheint wie ein zusätzlicher Schritt - es muss eine Möglichkeit geben, die Ausgabe in die Schleife zu stellen. – yoscar

+0

@yoscar Siehe bearbeiten. Endlich mal wieder mit 'ForEach-Object' herumgespielt – gms0ulman

0

Ihr ForEach-Object nur enthält Aussagen (variable Zuweisungen). Es gibt nichts zurück. Sie müssen etwas zurückgeben, andernfalls übergeben Sie eine leere Pipeline an Export-CSV.

ich, dass zu raten, statt Einstellgrößen genannt $Reg, $RegKey und $description (und dann nie ihre Werte verwenden), was Sie wirklich wollen, zu tun ist, erstellen Spalten in der CSV Reg genannt, RegKey und description. In diesem Fall möchten Sie jedes Mal eine [PSCustomObject] (mit diesen Eigenschaften hinzugefügt) durch die Schleife.

$server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 
$server | ForEach-Object { 
    [PSCustomObject] @{ 
     Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$_.Name) 
     RegKey = $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters") 
     description = $RegKey.GetValue("srvcomment") 
    } 
} | Export-Csv .\out1.csv