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-Key: 207398

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

Printed on: April 19, 2024 at 11:04 o'clock

Member: colinardo
colinardo Jun 03, 2013 updated at 13:34:49 (UTC)
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
Member: Gundelputz
Gundelputz Jun 03, 2013 at 13:33:44 (UTC)
Goto Top
Danke
probiere es gleich mal aus
Member: Gundelputz
Gundelputz Jun 03, 2013 at 13:58:02 (UTC)
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"
Member: colinardo
colinardo Jun 03, 2013 at 14:02:21 (UTC)
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
Member: Gundelputz
Gundelputz Jun 03, 2013 at 14:05:14 (UTC)
Goto Top
Gott bin ich ein Trottel
Member: Gundelputz
Gundelputz Jun 03, 2013 at 14:17:44 (UTC)
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?
Member: colinardo
colinardo Jun 03, 2013 updated at 14:41:09 (UTC)
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
Member: Gundelputz
Gundelputz Jun 04, 2013 at 06:32:42 (UTC)
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
Member: Gundelputz
Gundelputz Jun 04, 2013 at 07:21:54 (UTC)
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.
Member: colinardo
colinardo Jun 04, 2013 updated at 07:28:57 (UTC)
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 ?
Member: Gundelputz
Gundelputz Jun 04, 2013 at 07:47:18 (UTC)
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
Member: colinardo
colinardo Jun 04, 2013 at 07:54:38 (UTC)
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
Member: colinardo
colinardo Jun 04, 2013 at 08:01:37 (UTC)
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.
Member: Gundelputz
Gundelputz Jun 04, 2013 at 08:02:10 (UTC)
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.
Member: Gundelputz
Gundelputz Jun 04, 2013 at 08:05:58 (UTC)
Goto Top
get-member ist genau das was ich gesucht habe. Ich hoffe das hilft mir nicht mehr ganz so simple Fragen zu stelle.
Member: colinardo
colinardo Jun 04, 2013 updated at 08:13:46 (UTC)
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)