2017-08-11 2 views
3

Ich schreibe eine Reihe von PowerShell-Skripts, um die Größe der verschiedenen Ordner zu überwachen. Ich bin auf einen Fehler gestoßen, und ich habe keine Ahnung, was das verursacht. HierPowershell-Funktion zu viele Parameter übergeben

ist der Code, mit Write-Host zeigen, was ich erwarte und was die Variablen $ip und $loc tatsächlich enthalten:

function getDriveLetter($ip) { 
    Write-Host $ip # prints: 192.168.10.10 myfolder1\myfolder2\ 
         # expected: 192.168.10.10 
    switch($ip) { 
     "192.168.10.10" {return "E`$"; break} 
     "192.168.10.20" {return "D`$"; break} 
     default {"Unknown"; break} 
    } 
} 

function getFullPath($loc,$folder) { 
    Write-Host $loc # prints: 192.168.10.10 myfolder1\myfolder2\ 
         # expected: 192.168.10.10 
    $drive = getDriveLetter("$loc") 
    $str = "\\$loc\$drive\DATA\$folder" 
    return $str 
} 

function testPath($loc,$folder) { 
    $mypath = getFullPath("$loc","$folder") 
    if (Test-Path $mypath) { 
     return $true 
    } else { 
     return $false 
    } 
} 

Wenn ich den Befehl ausführen:

testPath("192.168.10.10","myfolder1\myfolder2\") 

Ich erhalte ein "falsches" Ergebnis, aber wenn ich renne:

Der Befehl gibt True (wie es sollte) zurück.


Was habe ich verpasst? Ich habe versucht zu erzwingen, dass die Variablen gesetzt werden mit:

$mypath = getFullPath -loc "$loc" -folder "$folder" 

aber es gibt keine Änderung. Wenn es etwas ändert, ist dies auf PowerShell Version 4.

Antwort

3

Ich würde vorschlagen, dass Sie die Syntax von PowerShell ein wenig mehr überprüfen, weil es viele Fehler drin gibt. PowerShell unterscheidet sich ziemlich von C# und Sie scheinen eine Menge Annahmen zu treffen. :)

Zunächst einmal nennt man PowerShell-Funktionen nicht so. Auch nicht sicher, warum Sie Zitate um die Parameter hinzugefügt haben? Sie sind redundant. Wenn Sie die Funktionsaufrufe korrigieren, sollte Ihr Code wie erwartet funktionieren.

Dann gibt es ein Semikolon in Ihrer switch-Anweisung, die auch falsch ist. Dann müssen Sie nicht die $ entkommen, wenn Sie nur '' verwenden. Die Pause ist auch redundant, da die Rückgabe in diesem Fall die Funktion verlässt.

"192.168.10.10" { return 'E$' } 

Auch eine interessante Sache über Powershell: Sie könnten nur loswerden der Rückkehr erhalten in getFullPath:

function getFullPath($loc, $folder) { 
    $drive = getDriveLetter($loc) 
    "\\$loc\$drive\DATA\$folder" 
} 

Powershell gibt nicht erfassten Ausgabe, was wichtig ist, bewusst zu sein, kann es sein, die Ursache für viele obskure Fehler.

+0

Dies löste es, vielen Dank! Ich werde auch das Skript (und einige andere tatsächlich) mit Ihren anderen Vorschlägen aktualisieren. Ich möchte, dass Powershell mehrere Argumente mit Klammern unterstützt. Ich glaube, dass die Argumente mit Leerzeichen getrennt nicht so sauber aussehen. – Elmepo

2

Das Problem besteht darin, wie Sie Ihre Funktionen aufrufen. Funktionsargumente sind in PowerShell durch Leerzeichen getrennt und enthalten keine Klammern, um die Argumente zu umschließen.

Wenn Sie Argumente in Klammern umbrechen, erstellen Sie ein Array, das zwei Werte enthält, und übergeben dieses Array als erstes Argument.

getFullPath($loc, $folder) 

Diese Linie verläuft ein Array zwei Strings @($loc, $folder) als erstes Argument enthält, und dann, weil es keine anderen Argumente auf der Linie sind, ist es übergibt $null auf die zweite. Innerhalb der Funktion ist das Array dann join ed, um als eine Zeichenfolge verwendet zu werden, was das beobachtete Verhalten ist.

2

Das Problem ist, wie Sie die Parameter an die Funktionen übergeben. Weitere Details über obigen Link: How do I pass multiple parameters into a function in PowerShell?

function getDriveLetter() { 
    param($ip) 
    switch($ip) { 
     "192.168.0.228" {return "E`$"; break} 
     "192.168.10.20" {return "D`$"; break} 
     default {"Unknown"; break} 
    } 
} 

function getFullPath() { 
    param($loc, $folder) 
    $drive = getDriveLetter -ip $loc 
    $str = "\\$loc\$drive\DATA\$folder" 
    return $str 
} 

function testPath() { 
    param($loc, $folder) 
    $mypath = getFullPath -loc $loc -folder $folder 
    if (Test-Path $mypath) { 
     return $true 
    } else { 
     return $false 
    } 
} 
testPath -loc "192.168.10.10" -param "myfolder1\myfolder2\" 
Verwandte Themen