m.c.trust
Goto Top

Mehrere CSV-Dateien auslesen, bearbeiten und wieder speichern über PowerShell

Hallo Zusammen,

ich komme in der PowerShell nicht weiter. Wahrscheinlich ist es für euch eine Kleinigkeit, für mich aber gerade nicht zu lösen.

Situation:
Einige Clients speichern auf ein Netzlaufwerk Computerinformationen von sich in Form einer CSV-Datei ab. Diese CSV-Dateien beinhalten dann solche Sachen wie Computername, aktueller User, letzter User, IP, Online/Offline etc. Die Dateien sind nach den Computernamen (Hostnamen) der PCs benannt.
Ein PowerShell-Skript soll nun diese Dateien einlesen und prüfen, ob der Status Online oder Offline noch korrekt ist anhand eines Pings über die IP und den jeweilige Status in die CSV an diese Stelle schreiben. Ist der PC Offline, soll zusätzlich der aktuelle User und der letzte User rausgelöscht- und durch ein "X" ersetzt werden. Anschließend soll die CSV einfach wieder mit dem alten Hostnamen des PCs abgespeichert/aktualisiert werden.

Infos zu der CSV:
So sieht aktuell eine der CSVs aus
(Computername);(Username Angemeldet);(Username Abgemeldet);(Standort);(IPAdresse);(MacAdresse);(Status Online/Offline)
PC-Einkauf1;Müller;Schmitt;Maierstraße1;172.16.10.31;F4-F5-F6-F7-F8-F9;Online
Die CSV-Dateien haben keinen Header.

Was ich bis jetzt geschafft habe:
Ich kann eine einzelne Datei aufrufen, die Verbindung testen und abfragen. Ich kann sie nicht abspeichern und nicht in eine Schleife bauen.
$Header = "Hostname","Username Angemeldet","Username Abgemeldet","Standort","IPAdresse","MacAdresse","Online/Offline"  
$Content = import-csv -Path "\\Server1\PC-Informationen\PC-Einkauf1.csv" -header $Header -Delimiter ";"  

if (test-connection $Content.IPAdresse -count 1 -Quiet)
{
$Content."Online/Offline" = "Online"  
}
else
{
$Content."Online/Offline" = "Offline"  
}

echo $Content."Online/Offline"  

Ist für euch vielleicht ganz einfach.
Wäre schön, wenn mir jemand helfen könnte.
Danke und LG!

Content-Key: 2627183874

Url: https://administrator.de/contentid/2627183874

Printed on: April 23, 2024 at 17:04 o'clock

Member: MrCount
MrCount Apr 28, 2022 updated at 11:06:54 (UTC)
Goto Top
Servus,

hiermit sollte jede CSV nacheinander eingelesen, verarbeitet und mit neuem Inhalt gespeichert werden:

Get-ChildItem *.csv -Recurse | foreach {

    $Header = "Hostname","Username Angemeldet","Username Abgemeldet","Standort","IPAdresse","MacAdresse","Online/Offline"  
    $Content = import-csv -Path "\\Server1\PC-Informationen\PC-Einkauf1.csv" -header $Header -Delimiter ";"  

    if (test-connection $Content.IPAdresse -count 1 -Quiet)
    {
        $Content."Online/Offline" = "Online"  
    }
    else
    {
        $Content."Online/Offline" = "Offline"  
    }

    $Content | Out-File $_

}


(Code nicht getestet!)

Wenn du CSVs mit mehreren Einträgen hast, dann muss man ggf. noch ein wenig umbauen...
Member: M.C.Trust
M.C.Trust Apr 28, 2022 updated at 13:25:26 (UTC)
Goto Top
Danke für die Antwort. Hat leider nicht funktioniert. Wenn ich das ganze ausführe, passiert nicht . Es kommt auch keine Fehlermeldung. Ich habe oberhalb bei Get-Childitem noch den Pfad hinzugefügt. Aktuell sieht es so aus:

Get-ChildItem -path "\\Server1\PC-Informationen\*.csv" -Recurse | foreach {  

    $Header = "Hostname","Username Angemeldet","Username Abgemeldet","Standort","IPAdresse","MacAdresse","Online/Offline"  
    $Content = import-csv -Path "\\Server1\PC-Informationen\PC-Einkauf1.csv" -header $Header -Delimiter ";"  

    if (test-connection $Content.IPAdresse -count 1 -Quiet)
    {
        $Content."Online/Offline" = "Online"  
    }
    else
    {
        $Content."Online/Offline" = "Offline"  
        $Content."User Angemeldet" = "X"  
        $Content."User Abgemeldet" = "X"  
    }

    $Content | Out-File $_

}

Jetzt kommt der Fehler:
Test-Connection : Das Argument für den Parameter "ComputerName" kann nicht   
überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, 
das nicht NULL oder leer ist, und führen Sie den Befehl erneut aus.
In Zeile:6 Zeichen:25
+ if (test-connection $Content.IPAdresse -count 1 -Quiet)
+                     ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Test-Connection], ParameterBin 
   dingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Power 
   Shell.Commands.TestConnectionCommand

Er kann anscheinend das $Content.IPAdresse nicht erkennen. Liegt das vielleicht an dem Header?
Member: MrCount
MrCount Apr 28, 2022 at 15:15:24 (UTC)
Goto Top
Sorry, mein Fehler...

so sollte es hoffentlich gehen....

Zeile 4:
$Content = import-csv -Path $_.Fullname -header $Header -Delimiter ";"  


Vielleicht auch interessant zu lesen: https://redmondmag.com/articles/2020/04/09/how-to-use-csv-with-powershel ...
Member: M.C.Trust
M.C.Trust Apr 28, 2022 at 17:10:46 (UTC)
Goto Top
Ja, hat tatsächlich geholfen, Danke!
Jetzt muss nur die Ausgabe noch genauso aussehen wie vorher. Aktuell ist es so:
Hostname            : PC-Einkauf1
Angemeldeter User   : X
Abemeldeter User    : X

Wenn ich das ganze mit export-csv versuche kommt folgendes:
#TYPE System.Management.Automation.PSCustomObject
"Hostname","Username Angemeldet","Username Abgemeldet",........  
"PC-Einkauf1","X","X",........   
Wenn ich ein -NoTypeInformation hinzufüge, verschwindet lediglich das "#TYPE System....", der Rest bleibt. Bekommt man das hin, so wie es vorher war? Also ohne die erste Zeile. ohne "" und statt , ein ;?
Member: MrCount
MrCount Apr 28, 2022 at 19:31:02 (UTC)
Goto Top
Also den Delimiter kannst du ja setzen...

Export-Csv ... -delimiter ';'  

Und die "" solltest du so entfernen können:

$Content = $Content.Replace('"','')  
Member: M.C.Trust
M.C.Trust Apr 29, 2022 at 07:33:46 (UTC)
Goto Top
Sorry aber ich bekomms einfach nicht hin mit dem Replace...... wenn ichs so mache

$Content = $Content.Replace('"','')  
$Content | export-csv -NoTypeInformation -delimiter ";" $_  

schreibt er mir in die CSV "Length 25".... habs auch mit - replace versucht, hat nichts gebracht
Member: MrCount
MrCount Apr 29, 2022 at 07:49:34 (UTC)
Goto Top
So geht's:

$Content = $Content.Replace('"','')  
$Content = $Content.Replace(',',';')  

$Content |  Select-Object -Skip 1 | Out-File .\test.csv
Member: M.C.Trust
M.C.Trust Apr 29, 2022 at 11:43:03 (UTC)
Goto Top
Macht er leider auch nicht. Er sagt,
Fehler beim Aufrufen der Methode, da 
[System.Management.Automation.PSCustomObject] keine Methode mit dem Namen 
"Replace" enthält.  
In Zeile:25 Zeichen:1
+ $Content = $Content.Replace('"','')  
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Replace:String) , RuntimeEx 
   ception
    + FullyQualifiedErrorId : MethodNotFound

So siehts aktuell aus:
Get-ChildItem -path "\\Server1\PC-Informationen\*.csv" -Recurse | foreach {  

    $Header = "Hostname","Username Angemeldet","Username Abgemeldet","Standort","IPAdresse","MacAdresse","Online/Offline"  
    $Content = import-csv -Path $_.Fullname -header $Header -Delimiter ";"  

    if (test-connection $Content.IPAdresse -count 1 -Quiet)
    {
        $Content."Online/Offline" = "Online"  
    }
    else
    {
        $Content."Online/Offline" = "Offline"  
        $Content."User Angemeldet" = "X"  
        $Content."User Abgemeldet" = "X"  
    }

    $Content = $Content.Replace('"','')  
    $Content = $Content.Replace(',',';')  

    $Content |  Select-Object -Skip 1 | Out-File .\test.csv

}