gundelputz
Goto Top

Variablen in CSV-Datei speichern

Hallo alle zusammen

ich beschäftige mich seit einigen Tagen mit Powershell und bin begeistert wie mächtig dies doch ist.
Als Neuling habe ich natürlich auch gleich ein paar Fragen.
um daten zu erfassen möchte ich ein paar Variablen in eine CSV-Datei speichern. Hierzu habe ich mal zum testen 3 variablen erstellt. Meine Frage ist nun:
1. wie speichere ich diese in einer CSV
2. wie kann ich einen weiteren Datensatz an diese Datei anhängen
3. wie kann ich die Daten wieder auslesen

vielen dank im vorraus

Content-ID: 207398

Url: https://administrator.de/forum/variablen-in-csv-datei-speichern-207398.html

Ausgedruckt am: 23.12.2024 um 16:12 Uhr

colinardo
colinardo 03.06.2013 aktualisiert um 15:34:49 Uhr
Goto Top
Hallo Gundelputz,

was du machen kannst ist die Variablen in eine Hashtable einzutragen dann ein PS-Objekt daraus zu erstellen und mit Export-CSV in eine CSV zu exportieren:

back-to-topExport in eine CSV
$hashtable = @{"Name"="Sepp";"Nachname"="Meier"}  
$obj = New-Object PSObject -Property $hashtable
$obj | export-csv -Path "C:\test.csv" -NoTypeInformation  

back-to-topImport einer CSV in ein Objekt
$csv = import-csv -Path "C:\test.csv"  

back-to-topZugriff auf die Inhalte des CSV-Objekts
$csv | %{write-host $_.Name $_.Nachname}

Grüße Uwe
Gundelputz
Gundelputz 03.06.2013 um 15:33:44 Uhr
Goto Top
Danke
probiere es gleich mal aus
Gundelputz
Gundelputz 03.06.2013 um 15:58:02 Uhr
Goto Top
habs mal geteste

$var1 = 5
$var2 = 10
$var3 = 20
$hashtable = @{"Drucker" = $var1;"IP" = $var2;"Zähler" = $var3}
$obj = New-Object PSObject -Property $hashtable
$hashtable | export-csv -Path "c:\usr\snmpget\test-csv.csv" -NoTypeInformation

bekomme folgende Einträge

IsReadOnly,"IsFixedSize","IsSynchronized","Keys","Values","SyncRoot","Count"
False,"False","False","System.Collections.Hashtable+KeyCollection","System.Collections.Hashtable+ValueCollection","System.Object","3"
colinardo
colinardo 03.06.2013 um 16:02:21 Uhr
Goto Top
Das ist falsch:
$hashtable | export-csv -Path "c:\usr\snmpget\test-csv.csv" -NoTypeInformation
es muss so heißen:
$obj | export-csv -Path "c:\usr\snmpget\test-csv.csv" -NoTypeInformation
war oben ein Schreibfehler, sorry
Gundelputz
Gundelputz 03.06.2013 um 16:05:14 Uhr
Goto Top
Gott bin ich ein Trottel
Gundelputz
Gundelputz 03.06.2013 um 16:17:44 Uhr
Goto Top
Da dies so Super klappt gleich noch ne Frage. Mit folgendem Code lese ich einen Zählerstand von einem Drucker aus und speicher ihn in einer txt:

snmpget.exe -c public -v 2c $IP .1.3.6.1.4.1.1347.42.2.1.1.1.6.1.1 >"c:\usr\snmpget\1.txt"

in der ersten Zeile steht dann:

SNMPv2-SMI::enterprises.1347.42.2.1.1.1.6.1.1 = INTEGER: 8382

Meine Frage ist jetzt:
kann ich evtl. den Zähler gleich in eine Variable speichern und wenn nein wie kann ich den Zählerstand aus der TXT auslesen?
colinardo
colinardo 03.06.2013 aktualisiert um 16:41:09 Uhr
Goto Top
Das ginge z.B. so
$string = get-content "c:\usr\snmpget\1.txt"  
$zaehler = $string.Substring($string.LastIndexOf(":")+2, $string.length - ($string.LastIndexOf(":")+2))  
und mit Regular Expressions so:
Function Get-Matches($Pattern,$groupNumber = 0) {
  begin { $regex = New-Object Regex($pattern) }
  process { foreach ($match in ($regex.Matches($_))) { ([Object[]]$match.Groups)[$groupNumber].Value } }
}

$string = get-content "c:\usr\snmpget\1.txt"   
$zaehler = $string | Get-Matches "(\d*$)"  
face-wink
Gundelputz
Gundelputz 04.06.2013 um 08:32:42 Uhr
Goto Top
Danke, echt Super.
habe Gestern noch über den import aus der csv gesessen und bin leider nicht viel weiter gekommen.

$csv = import-csv -Path "C:\usr\snmpget\test.csv"

wird zwar ohne Fehlermeldung ausgeführt aber ich scheitere dann am import der Zeilen.
das gleiche gilt für das anhängen von Datensätzen. hier muss es doch so etwas wie open for append geben.

kannst du mir da etwas an Literatur empfehlen(in deutscht)in der alles beschrieben wird. so was wie ein Kompendium mit vielen Beispielen und Erleuterungen.
das Handbuch ist für einen Anfänger wie mich doch etwas verworren. Bis du erst mal den richtigen Befehl hast dauert es schon ewig und vom verstehen kann dann bei mir noch gar nicht die Rede sein. Deswegen bin ich dir sehr dankbar für deine Hilfe weil ich so Stück für Stück den Code zerlegen und verstehen kann.
Danke noch mal
Gundelputz
Gundelputz 04.06.2013 um 09:21:54 Uhr
Goto Top
und gleich noch ne Frage. Wie kann ich Variablen konvertieren. Finde weder im Handbuch noch im Netz was passendes. Ist wahrscheinlich so einfach das es nicht der rede wert ist.
habs mal mit
$var1.ToString($zaehler)
probiert. bringt aber nichts.
colinardo
colinardo 04.06.2013 aktualisiert um 09:28:57 Uhr
Goto Top
Zitat von @Gundelputz:
wird zwar ohne Fehlermeldung ausgeführt aber ich scheitere dann am import der Zeilen.
die Zeilen kannst du dir ja erst mal anzeigen lassen indem du einfach $csv in der Shell eingibst. Um auf die einzelnen Zeilen mit deren Werten zuzugreifen musst du eine Schleife verwenden, wie in meinem ersten Kommentar geschrieben:
$csv | %{write-host $_.Name $_.Nachname}
hierbei wird der inhalt der CSV-Datei via PIPE(|) an das Foreach-Cmdlet übergeben(das %{} ist eine Abkürzung für Foreach-Object) - in der Schleife kannst du dann auf die Zeile mit $_ zugreifen, um dann z.B. auf die Spalte "Vorname" zuzugreifen schreibst du $_.Vorname.

das gleiche gilt für das anhängen von Datensätzen. hier muss es doch so etwas wie open for append geben.
wenn du nur etwas an eine CSV-Datei anhängen willst, kannst du das auch ohne Import der Daten folgendermaßen machen:
"`nSepp,Meier,Musterstraße 20,55555 Musterhausen" | Out-File -Append "C:\test.csv" -Encoding UTF8
Du hängst den Inhalt als String direkt an die CSV-Datei und behältst dabei dessen Inhalt. Das `n am Anfang erzeugt einen Zeilenumbruch in der Datei damit die Daten in einer neuen Zeile anfangen.

kannst du mir da etwas an Literatur empfehlen(in deutscht)in der alles beschrieben wird. so was wie ein Kompendium mit vielen
Beispielen und Erleuterungen.
das Handbuch ist für einen Anfänger wie mich doch etwas verworren. Bis du erst mal den richtigen Befehl hast dauert es
Also, ich habe so angefangen das ich mir in der Hilfe-Datei zur Powershell mal die Einführung durchgelesen habe und dann alles Schritt für Schritt aus dem Netz gezogen habe wenn ich was nicht verstanden habe. Wenn du Windows 7 verwendest, starte mal den "Windows Powershell ISE" Editor und drücke F1 dort findest du die Einführung.

und gleich noch ne Frage. Wie kann ich Variablen konvertieren. Finde weder im Handbuch noch im Netz was passendes
in was willst du die Variable konvertieren ?
Gundelputz
Gundelputz 04.06.2013 um 09:47:18 Uhr
Goto Top
Super.
bei den Variablen habe ich zum rechnen zwei Stück als [int] deklariert. will ich nun in $var1 = $zaehler übergeben bekomme ich folgende Fehlermeldung:

Der Wert "System.Object" vom Typ "System.Object" kann nicht in den Typ "System.Int32" konvertiert werden.
Bei C:\usr\snmpget\t1.ps1:25 Zeichen:6

back-to-top$var1 <<<< = $zaehler

+ CategoryInfo : MetadataError: (face-smile , ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException

in Excel oder C gibt es da so Sachen wie var1 = Cint(zaehler)
also allgemein gesagt interessiert mich die umwandlung von Variablentypen in andere Typen zB int to str oder Str to int
colinardo
colinardo 04.06.2013 um 09:54:38 Uhr
Goto Top
Ah OK.
Das geht so:
[Convert]::toInt32($zaehler)
oder
[Convert]::toString($integer)

siehe auch hier: http://www.pavleck.net/powershell-cookbook/ch06.html
colinardo
colinardo 04.06.2013 um 10:01:37 Uhr
Goto Top
noch zur Info die Dir beim lernen von Powershell hilft:
Das CMDLet get-member kann dir Funktionen und Eigenschaften eines Objektes anzeigen die es unterstützt. Z.b. möchte ich wissen was für Methoden ich mit einem String ausführen kann. dazu übergebe ich einfach das entsprechende Objekt an get-member:
"Test" | get-member
und schon bekomme ich schön aufgelistet was ich mit dem String machen kann, bzw. welche Funktionen unterstützt werden.
Gundelputz
Gundelputz 04.06.2013 um 10:02:10 Uhr
Goto Top
dacht ich mir doch das dies keine Hürde sein dürfte. Warum dies nicht in der Hilfe steht ist mir ein Rätsel. Hier finde ich nur Convert-Path und zu toInt32 gleich gar nix. Schade.
Vielen dank noch mal.
Gundelputz
Gundelputz 04.06.2013 um 10:05:58 Uhr
Goto Top
get-member ist genau das was ich gesucht habe. Ich hoffe das hilft mir nicht mehr ganz so simple Fragen zu stelle.
colinardo
colinardo 04.06.2013 aktualisiert um 10:13:46 Uhr
Goto Top
und noch was zur Hilfefindung:
get-help DeinSuchbegriff
zeigt dir verfügbare CMDLets an die mit dem Suchbegriff zu tun haben.
ansonsten kannst du mit Powershell auch die ganze Welt der .NET-Funktionen oder COM-Objekten benutzen wenn du willst.

So denke das ist mal genug Stoff fürs erste ...
Nun viel Spaß beim lernen, du wirst sehen, einmal dran gewöhnt wilst du Batch nicht mehr sehen. face-wink
Wenn noch irgendwelche Fragen auftauchen kannst du dich gerne per PM an mich wenden.

(p.s. Bitte markiere den beitrag noch als gelöst, merci)