derhoeppi
Goto Top

PowerShell Parameterübergabe in Funktion

Hallo,

ich arbeite in PowerShell derzeit mit einer SSH Net Libary um eine SSH Verbindung zu Netzwerk-Switchen herzustellen. Im Internet habe dazu ein Beispielskript gefunden, dass ich bereits weitestgehend angepasst habe. Mir bereit jedoch ein Punkt Probleme.

$server = "server1"  
$port = 22
$username = "user1"  
$password = "password1"  

###############################################################

function ReadStream($reader)
{
    $line = $reader.ReadLine();
    while ($line -ne $null)
    {
        $line
        $line = $reader.ReadLine()
    }
}

function WriteStream($cmd, $writer, $stream)
{
    $writer.WriteLine($cmd)
    while ($stream.Length -eq 0)
    {
        start-sleep -milliseconds 500
    }
}

###############################################################

$ssh = new-object Renci.SshNet.SshClient($server, $port, $username, $password)
$ssh.Connect()

$stream = $ssh.CreateShellStream("dumb", 80, 24, 800, 600, 1024)  

$reader = new-object System.IO.StreamReader($stream)
$writer = new-object System.IO.StreamWriter($stream)
$writer.AutoFlush = $true

while ($stream.Length -eq 0)
{
    start-sleep -milliseconds 500
}
ReadStream $reader

WriteStream "su - root" $writer $stream  
ReadStream $reader

$stream.Dispose()
$ssh.Disconnect()
$ssh.Dispose() 

Die Zeile "WriteStream "su - root" $writer $stream" übergibt ja den String "su - root" als Variable $cmd an die Funktion WriteStream. Ich möchte / muss aber $cmd variabel halten, weil ich erst zur Laufzeit die $cmd bestimme. Meine Versuche das ganze zu verändern haben nicht zum Erfolg geführt.
Das waren meine Versuche
$Variable = "su - root" + $Laufzeitvariable  
WriteStream $Variable $writer $stream

oder

WriteStream "su - root"+$Laufzeitvariable  $writer $stream  

Wo liegt mein Fehler bei der Übergabe der Parameter?

Gruß
derhoeppi

Content-Key: 278491

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

Ausgedruckt am: 19.03.2024 um 09:03 Uhr

Mitglied: 114757
Lösung 114757 27.07.2015 aktualisiert um 12:16:48 Uhr
Goto Top
Moin,
Stichwort Variable-Scope ! Du übergibst zwar die Objekte als Parameter an die Funktionen, und diese können von der Funktion gelesen werden, jedoch werden Änderungen innerhalb der Funktion an die Variablen außerhalb der Funktion nicht weitergegeben und sind nur innerhalb der Funktion ersichtlich. Das kommt vom Variable-Scope, eine der wichtigsten Dinge in Powershell die du unbedingt mal nachlesen solltest: https://technet.microsoft.com/en-us/library/hh847849.aspx
Nutze stattdessen Script oder globale Variablen, oder gebe aus der Funktion die geänderten Objekte mit Return zurück und Weise sie Variablen zu.

Gruß jodel32
Mitglied: SaschaRD
SaschaRD 27.07.2015 um 11:40:59 Uhr
Goto Top
Hallo derhoeppi,

das Übergeben von Parametern an eine Funktion erfolgt beispielsweise so:
function WriteStream($cmd)
{
    $writer.WriteLine($cmd)
}
Der Aufruf bzw. das Übergeben eines Wertes von $cmd
WriteStream -cmd "DerWert"  
Bei meheren Werten einfach eine Verkettung.
WriteStream -cmd "DerWert" -abc "WertABC" -xyz "WertXYZ"  

Gruß, Sascha