2017-08-11 42 views
3

さまざまなフォルダのサイズを監視するPowerShellスクリプトのセットを作成しています。私はエラーに遭遇しましたが、何が原因なのか分かりません。Powershell関数が渡されるパラメータが多すぎます

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

私は取得しています:

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 
    } 
} 

私はコマンドを実行すると:ここ

は、変数 $ip$locが実際に含まれているものを私は期待していと何 Write-Hostを示すとともに、コードです「偽」の結果が表示されますが、実行した場合:

Test-Path "\\192.168.10.10\E`$\DATA\myfolder1\myfolder2\" 

このコマンドはTrueを返します。


何が欠けていますか?変数を強制的に設定しようとしました。

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

しかし、変更はありません。何か変更があった場合、これはPowershellバージョン4にあります。

答えて

3

ここには多くの間違いがあるため、PowerShellの構文をもう少し見直すことをお勧めします。 PowerShellはC#とはかなり異なっており、多くの前提があるようです。 :)

まず、PowerShellの関数を呼び出す方法ではありません。なぜあなたはパラメータの周りに引用符を追加したのかわからない?彼らは冗長です。関数呼び出しを修正すると、コードが期待通りに機能するはずです。

$mypath = getFullPath $loc $folder 

switchステートメントにはセミコロンもありますが、これも間違っています。 ''を使用すると、$をエスケープする必要はありません。この場合、リターンは関数を終了するため、ブレークも冗長です。

"192.168.10.10" { return 'E$' } 

また、PowerShellの約興味深い:あなたはちょうどgetFullPathでリターンを取り除くことができます:

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

PowerShellはを認識することが重要である捕捉されていない出力を返し、それはすることができます多くの不明瞭なバグの原因。

+0

これはどうもありがとう、それを解決しました!私はまた、あなたの他の提案でスクリプト(そしてかなりの数の他のもの)を更新します。私はPowershellが括弧で複数の引数をサポートしたいと思っていますが、スペースで区切られた引数はきれいに見えません。 – Elmepo

2

問題は、どのように関数を呼び出すかにあります。関数の引数はPowerShellで区切られたスペースで、引数を囲むためにかっこは使用しません。

getFullPath $loc $folder 

引数をカッコで囲むと、2つの値を含む配列が作成され、その配列が最初の引数として渡されます。

getFullPath($loc, $folder) 

この行は、最初の引数として2つの文字列を@($loc, $folder)含む配列を通過し、ライン上の他の引数が存在しないため、その後、それは第二に$nullを渡します。関数内で配列はjoinになり、これは文字列として使用されます。これは観察した動作です。

2

問題は、関数にパラメータを渡す方法です。 は、上記のリンクの詳細を参照してください: 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\" 
関連する問題