PowerShell SSH Verbindung - Output exportieren
Hallo Leute,
ich möchte ein kleines Skript erstellen, dass mir Werte über eine SSH Verbindung ausliest. Um mit der PowerShell eine SSH Verbindung aufzubauen, benutze ich die SSH.Net Libary von CodeComplex. Damit schaffe ich es eine Verbindung zu meinem Target aufzubauen und das entsprechende Kommando abzusetzen. Nun möchte ich aber die Ausgabe des Kommandos in eine Variable schreiben, die ich anschließend als CSV ausgeben kann. Genau an diesem Punkt scheitere ich, weil er mir nicht den Variableninhalt in die CSV schreibt, sondern Tags wie TypeInformation und Lenght. Wie komme ich aber an den eigentlichen Inhalt?
Gruß
derhoeppi
ich möchte ein kleines Skript erstellen, dass mir Werte über eine SSH Verbindung ausliest. Um mit der PowerShell eine SSH Verbindung aufzubauen, benutze ich die SSH.Net Libary von CodeComplex. Damit schaffe ich es eine Verbindung zu meinem Target aufzubauen und das entsprechende Kommando abzusetzen. Nun möchte ich aber die Ausgabe des Kommandos in eine Variable schreiben, die ich anschließend als CSV ausgeben kann. Genau an diesem Punkt scheitere ich, weil er mir nicht den Variableninhalt in die CSV schreibt, sondern Tags wie TypeInformation und Lenght. Wie komme ich aber an den eigentlichen Inhalt?
Gruß
derhoeppi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 235138
Url: https://administrator.de/forum/powershell-ssh-verbindung-output-exportieren-235138.html
Ausgedruckt am: 27.04.2025 um 03:04 Uhr
16 Kommentare
Neuester Kommentar
Hallo derhoeppi,
damit du Werte vernünftig in eine CSV-Datei exportieren kannst sollte das was du exportieren willst ein PS-Objekt sein, und zusätzlich musst du im Export-CSV Befehl den Parameter -NoTypeInformation angeben. Du solltest also aus der Befehls-Ausgabe Objekte erstellen, an ein Array anhängen und dann das ganze an Export-csv übergeben. Alternativ schreibe das ganze via Out-File direkt in eine Datei wenn die Ursprungsausgabe schon das richtige CSV-Format hat.
Grüße Uwe
damit du Werte vernünftig in eine CSV-Datei exportieren kannst sollte das was du exportieren willst ein PS-Objekt sein, und zusätzlich musst du im Export-CSV Befehl den Parameter -NoTypeInformation angeben. Du solltest also aus der Befehls-Ausgabe Objekte erstellen, an ein Array anhängen und dann das ganze an Export-csv übergeben. Alternativ schreibe das ganze via Out-File direkt in eine Datei wenn die Ursprungsausgabe schon das richtige CSV-Format hat.
Grüße Uwe
du musst ja Objekte mit entsprechendem Inhalt erzeugen ... du hast ja nur die Überschriften(Member) erstellt.
hier ein Beispiel (ich verwende hier die kompilierte DLL von SSH.Net) / Kommentare im Code
Grüße Uwe
hier ein Beispiel (ich verwende hier die kompilierte DLL von SSH.Net) / Kommentare im Code
# Dll einbinden
Add-Type -Path "D:\Renci.SshNet.dll"
$connInfo = new-Object Renci.SshNet.PasswordConnectionInfo("SSH-SERVER","Username","Password")
$ssh = new-object Renci.SshNet.SshClient($connInfo)
# Verbinden
$ssh.connect()
# Command ausführen
$result = $ssh.RunCommand("lsvdisk")
#Verbindung trennen
$ssh.Disconnect()
$Array_return = @()
# Ausgabe des Befehls anhand der Zeilenumbrüche splitten
$lines = $result.Result.Split("`n")
# für jede Zeile in der Ausgabe
foreach($line in $lines){
# splitte die Zeile als Beispiel anhand des Semikolons für die Spalten
$cols = $line.Split(";")
# erstelle ein Objekt mit den Spalten und den Werten der jeweiligen Zeile und hänge es an das Array an
$Array_return += New-Object PSObject -Property @{"id"=$cols;"name"=$cols[1];"pool"=$cols[2]}
}
# Exportiere das Objekt als CSV
$Array_return |export-csv "C:\temp\testexport.csv" -NoTypeInformation
ich kann leider nicht hellsehen wie deine Original Beispielausgabe deine Befehls aussieht... poste mir doch bitte einen Auszug aus der Originalausgabe (aber bitte in Code-Tags). Merci.
Hallo hoeppi,
auch kein Beinbruch
in diesem Fall ändern wird die Schleife etwas ab (überspringen einfach die erste Zeile):
Alternativ wenn du bei der alten Schleifenvariante bleiben willst, kannst du die erste Zeile einfach so nach der Schleife ausfiltern:
Dann zur nächsten Frage: Um die nächste ID-Nummer aud dem Array zu ermitteln kannst du dies so machen:
oder alternativ so
In der Variablen $nextID ist dann die nächste freie Nummer enthalten
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
auch kein Beinbruch
for ($i=1;$i -lt $lines.Count;$i++){
$cols = $lines[$i].Trim() -split "\s+"
$Array_return += New-Object PSObject -Property @{"id"=$cols;"name"=$cols[1];"pool"=$cols[2]}
}
$Array_return = $Array_return | select -Skip 1
Dann zur nächsten Frage: Um die nächste ID-Nummer aud dem Array zu ermitteln kannst du dies so machen:
$nextID = ($Array_Return.id | measure -Maximum).Maximum + 1
$nextID = [int]($Array_Return.id | sort -Descending | select -First 1) + 1
Sprich habe ich ein Volume mit der ID 24 erhalte ich als Ergebnis 241
das kommt deswegen weil du zu einem String hinzuaddierst, und bei String bedeutet + einfach den String hinten anhängen. Um das zu verhindern musst du der Variablen zu der du addieren willst noch ein [int] voranstellen, so dass sie zu einem Integer umgewandelt wird.Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Zitat von @derhoeppi:
Hallo Uwe,
vielen Dank. Mit der nextID habe ich jedoch ein Problem. Er liest nicht die $Array_Return.id 's aus, so dass ich als Ergebnis immer nur einen Wert von 1 - also den Additionswert erhalte.
Dann machst du noch irgendetwas falsch, hier geht das einwandfrei...eventuell hast du eine ältere Powershell-Version als 3.0.Hallo Uwe,
vielen Dank. Mit der nextID habe ich jedoch ein Problem. Er liest nicht die $Array_Return.id 's aus, so dass ich als Ergebnis immer nur einen Wert von 1 - also den Additionswert erhalte.
Wenn ich das ausführe, erhalte ich immer 7 als Ergebnis der $nextID. Wenn $a die Werte mit 1-6 belegt hätte, wäre
ich glücklich, aber die Kollegen löschen auch mal ein Volume und dann soll die nächste freie Volume ID gewählt
werden. Als Ergebnis in diesem Bespiel hätte ich also den Wert 2 erwartet. Wenn in diesem Fall $a den Wert 1-6 hätte,
sollte mir die 7 ausgegeben werden. Muss ich an dieser Stelle mit einem Inhaltsvergleich arbeiten oder gibt es einen eleganteren Weg?
Beispiel: (Ergebnis: 2)ich glücklich, aber die Kollegen löschen auch mal ein Volume und dann soll die nächste freie Volume ID gewählt
werden. Als Ergebnis in diesem Bespiel hätte ich also den Wert 2 erwartet. Wenn in diesem Fall $a den Wert 1-6 hätte,
sollte mir die 7 ausgegeben werden. Muss ich an dieser Stelle mit einem Inhaltsvergleich arbeiten oder gibt es einen eleganteren Weg?
$arr = @(1,5,3,4,6)
$ids = $arr | sort
for($i=0;$i -lt $ids.count;$i++){
if ([int]$ids[$i] -ne [int]($ids[$i+1]-1)){
$nextID = [int]$ids[$i] + 1
break
}
}
$nextID
wenn du zwei Schleifen verschachtelst solltest du nie die Schleifenvariable $i doppelt verwenden, benutze also eine andere z.B. $z
mir fehlt jetzt inzwischen deine Logik bzw. dein bisheriger Code um hier noch weiter zu kommen, wenn bei mir das alles so geht wie es soll, sorry...
da liegt bei dir noch irgendeine "Variable" die ich mit meiner Glaskugel nicht sehen kann.
mir fehlt jetzt inzwischen deine Logik bzw. dein bisheriger Code um hier noch weiter zu kommen, wenn bei mir das alles so geht wie es soll, sorry...
da liegt bei dir noch irgendeine "Variable" die ich mit meiner Glaskugel nicht sehen kann.