Benutzer mit den meisten Antworten
Ergebnis Schleife mit ForEach-Object in Exceldatei ausgeben

Frage
-
Hallo zusammen,
ich versuche gerade die verbundenen Netzlaufwerke eines PCs mit einer ForEach-Object Schleife auszulesen und möchte das Ergebnis als csv Datei exportieren um z.B. eine Spalte mit den Laufwerksbuchsten, Typ zu haben.
Das würde das Sortieren nach vorhandenen Laufwerksbuchsten erleichtern.
$Computer = Get-content C:\Computerliste.txt
$i = 0
$Computer | ForEach-Object {$i++; "PC" + $i + ": " + $_ + "`n"
Get-WmiObject -Class Win32_LogicalDisk -ComputerName $_ | Select DeviceID,DriveType
'------------------'
"`n"}wenn ich hier | Export-CSV nach der Schleife anfüge, wird zwar die CSV Datei erstellt.
In der Datei finde ich aber nur eine Spalte mit Length und Zahlen als Werte.
Mit | out-file , wird das Ergebnis zwar richtig ausgegeben. Habe aber so keine Spalten um im Excel filtern zu können.
Muss ich hier noch etwas umwandlen damit in der CSV Datei das Ergebnis richtig ausgegeben wird ?
Danke.
Antworten
-
@hpotsirhc: Das was du vorschlägst tut bei mir nicht weil $a mehrere Einträge enthält und .PC als String nicht zugewiesen werden kann. (oder ich bin zu doof zum abtippen...)
@Sv.GR.
Wenn du wirklich "on-the-fly" Spalten zu einen Select addieren und gleich füllen möchtest, dann so:
$Computer=Get-content "C:\temp\Computerliste.txt" $AusgabeDatei="c:\temp\Ausgabe.csv" $i=0 $Ausgabe = @() $computer | %{ $i++ $pc="PC"+$i+": "+$_ $Ausgabe+=Get-WmiObject -Class Win32_LogicalDisk -ComputerName $_ | select DeviceID,DriveType,@{name="PC"; expression={$PC}} } $Ausgabe | Select PC,DeviceID,DriveType | Export-CSV $AusgabeDatei -NoTypeInformation -Delimiter ";" -Encoding UTF8
Wenn die DriveType noch als Text ausgeben möchtest:
$Computer=Get-content "C:\temp\Computerliste.txt" $AusgabeDatei="c:\temp\Ausgabe.csv" $i=0 $dt=@("Unknown","No Root Directory","Removable Disk","Local Disk","Network Drive","Compact Disc","RAM Disk") $Ausgabe = @() $computer | %{ $i++ $pc="PC"+$i+": "+$_ $Ausgabe+=Get-WmiObject -Class Win32_LogicalDisk -ComputerName $_ | #select DeviceID,DriveType,@{name="PC"; expression={$PC}} select DeviceID,@{name="DriveType"; expression={$dt[$_.DriveType]}},@{name="PC"; expression={$PC}} $Ausgabe.DriveType } $Ausgabe | Select PC,DeviceID,DriveType | Export-CSV $AusgabeDatei -NoTypeInformation -Delimiter ";" -Encoding UTF8
Alle Antworten
-
Hallo,
der Ablauf ist üblicherweise, dass du mit select die gewünschten Felder auswählst und diese dann mit Export-CSV ausgibst. Ich verstehe allerdings nicht, was dein '---------' und das Zeilenumbruch-"`n" in deinem Code machen.
Out-File sollte man nicht verwenden, um Objekte mit mehreren Eigenschaften auszugeben. Das ist nur für String-Arrays geeignet, da es einfach nur den Host-Output (also vereinfacht die Console) in eine Datei schreibt.
-
Ich habe es mir gerade nochmal angesehen. Es ist ungünstig, mehrere Pipelines ineinander zu verschachteln. Technisch ist das vielleicht möglich, aber lesbar ist es nicht. PowerShell ist zwar die erklärte Sprache des Einzeilers, aber man muss es auch nicht übertreiben. Mach es lieber so:
$Computer = Get-content C:\Computerliste.txt $i = 0 $Ausgabe = @() foreach($c in $Computer) { $i++ $a = Get-WmiObject -Class Win32_LogicalDisk -ComputerName $c $a = $a | select *,PC $a.PC = $i + ": " + $c $Ausgabe += $a } $Ausgabe | Select PC,DeviceID,DriveType | Export-CSV "C:\Path\Test.csv" -NoTypeInformation -Delimiter ";" -Encoding UTF8
Über das "select *,PC" wird ein neues leeres Feld angelegt, das dann in der nächsten Zeile gefüllt wird.
-
@hpotsirhc: Das was du vorschlägst tut bei mir nicht weil $a mehrere Einträge enthält und .PC als String nicht zugewiesen werden kann. (oder ich bin zu doof zum abtippen...)
@Sv.GR.
Wenn du wirklich "on-the-fly" Spalten zu einen Select addieren und gleich füllen möchtest, dann so:
$Computer=Get-content "C:\temp\Computerliste.txt" $AusgabeDatei="c:\temp\Ausgabe.csv" $i=0 $Ausgabe = @() $computer | %{ $i++ $pc="PC"+$i+": "+$_ $Ausgabe+=Get-WmiObject -Class Win32_LogicalDisk -ComputerName $_ | select DeviceID,DriveType,@{name="PC"; expression={$PC}} } $Ausgabe | Select PC,DeviceID,DriveType | Export-CSV $AusgabeDatei -NoTypeInformation -Delimiter ";" -Encoding UTF8
Wenn die DriveType noch als Text ausgeben möchtest:
$Computer=Get-content "C:\temp\Computerliste.txt" $AusgabeDatei="c:\temp\Ausgabe.csv" $i=0 $dt=@("Unknown","No Root Directory","Removable Disk","Local Disk","Network Drive","Compact Disc","RAM Disk") $Ausgabe = @() $computer | %{ $i++ $pc="PC"+$i+": "+$_ $Ausgabe+=Get-WmiObject -Class Win32_LogicalDisk -ComputerName $_ | #select DeviceID,DriveType,@{name="PC"; expression={$PC}} select DeviceID,@{name="DriveType"; expression={$dt[$_.DriveType]}},@{name="PC"; expression={$PC}} $Ausgabe.DriveType } $Ausgabe | Select PC,DeviceID,DriveType | Export-CSV $AusgabeDatei -NoTypeInformation -Delimiter ";" -Encoding UTF8
-
@hpotsirhc: Das was du vorschlägst tut bei mir nicht weil $a mehrere Einträge enthält und .PC als String nicht zugewiesen werden kann. (oder ich bin zu doof zum abtippen...)
@Sv.GR.
Wenn du wirklich "on-the-fly" Spalten zu einen Select addieren und gleich füllen möchtest, dann so:
$Computer=Get-content "C:\temp\Computerliste.txt"Wenn die DriveType noch als Text ausgeben möchtest:
$Computer=Get-content "C:\temp\Computerliste.txt" $AusgabeDatei="c:\temp\Ausgabe.csv" $i=0 $dt=@("Unknown","No Root Directory","Removable Disk","Local Disk","Network Drive","Compact Disc","RAM Disk") $Ausgabe = @() $computer | %{ $i++ $pc="PC"+$i+": "+$_ $Ausgabe+=Get-WmiObject -Class Win32_LogicalDisk -ComputerName $_ | #select DeviceID,DriveType,@{name="PC"; expression={$PC}} select DeviceID,@{name="DriveType"; expression={$dt[$_.DriveType]}},@{name="PC"; expression={$PC}} $Ausgabe.DriveType } $Ausgabe | Select PC,DeviceID,DriveType | Export-CSV $AusgabeDatei -NoTypeInformation -Delimiter ";" -Encoding UTF8
Hallo ,
super Vielen dank.
Das ist genau das was ich gesucht habe.
Funktioniert.
Wäre ich so bestimmt erstmal nicht drauf gekommen.
-
@hpotsirhc: Das was du vorschlägst tut bei mir nicht weil $a mehrere Einträge enthält und .PC als String nicht zugewiesen werden kann. (oder ich bin zu doof zum abtippen...)
Oh, ich habe übersehen, dass die Rückgabe natürlich ein Array ist. Dann ändert sich in meiner Schleife folgendes:
foreach($c in $Computer) { $i++ $a = Get-WmiObject -Class Win32_LogicalDisk -ComputerName $c $a = $a | select *,PC foreach($b in $a) { $b.PC = $i + ": " + $c $Ausgabe += $b } }
Mit deiner Lösung "Ausgabe += Get-WMI..." könntest du bei weiterer Verarbeitung Probleme bekommen, da du so ein Array aus mehreren Arrays bildest.