2013-04-10 18 views
6

何かがこの言語で本当に奇妙です。私は関数を実行し、その結果値を条件として使用しようとしています。これは私のコードです:PowerShellでの関数呼び出しの条件

function Get-Platform() 
{ 
    # Determine current Windows architecture (32/64 bit) 
    if ([System.Environment]::GetEnvironmentVariable("ProgramFiles(x86)") -ne $null) 
    { 
     echo "x64" 
     return "x64" 
    } 
    else 
    { 
     echo "x86" 
     return "x86" 
    } 
} 

if (Get-Platform -eq "x64") 
{ 
    echo "64 bit platform" 
} 
if (Get-Platform -eq "x86") 
{ 
    echo "32 bit platform" 
} 

予想される出力はこれです:

x64 
64 bit platform 

しかし、実際の出力がこれです:

64 bit platform 
32 bit platform 

ここで何が起こっていますか?どのようにこれを修正することができますか?私はifの条件の中で機能を使用するウェブ上の例を見つけることができませんでした。 Powershellではこれが可能ですか?私はWindows 7に特別なセットアップをしていないので、PSバージョンがあればそれが付属しています。

答えて

16

あなたは条件付きで関数の戻り値を比較したい場合は、グループ関数呼び出し(すなわち、それは括弧に入れて)しなければならないか(のように:ここで

は私の問題を解決します @FlorianGerhardtが推奨されます)関数の戻り値を変数に代入し、その変数を条件付きで使用します。さもなければ、比較演算子と他のオペランドは引数として関数に渡されます(あなたの場合は静かに破棄されます)。関数は、 ""でも 0でも $nullでもない結果を返しますので、 $trueと評価され、両方のメッセージが表示されます。

これは、あなたが欲しいものを行う必要があります。

... 
if ((Get-Platform) -eq 'x64') { 
    echo "64 bit platform" 
} 
... 

ところで、あなたは相互に排他的な条件のために別々のifステートメントを使用しないでください。プラットフォームについてif..then..elseif

$platform = Get-Platform 
if ($platform -eq "x64") { 
    ... 
} elseif ($platform -eq "x86") { 
    ... 
} 

またはswitch声明

Switch (Get-Platform) { 
    "x86" { ... } 
    "x64" { ... } 
} 

を確認し、より適切であろう。

私はまた、関数内にエコーすることも避けたいと思います。値を返すだけで、返された値に必要なエコーが発生します。関数の中にエコーされたものは、呼び出し元にも返されます。

最後に、個人的には、オペレーティングシステムのアーキテクチャを決定するための特定のフォルダまたは環境変数の存在に頼るのではなく、この機能は、オペレーティングシステムのアーキテクチャに応じて、文字列"32-Bit"または"64-Bit"を返します

function Get-Platform { 
    return (gwmi Win32_OperatingSystem).OSArchitecture 
} 

:このタスクのためにWMIを使用すると、私は、より信頼性の高いたくさんあると考えます。

+0

ありがとうございます。関数名のまわりのかっこを使用すると実際に関数を呼び出すように見えるので、これはそのような問題の普遍的な解決策のようです。他の変数名を使用するよりもずっと簡単です。 関数のエコー(機能するWrite-Hostで置き換えられます)は、トレース目的でのみ使用されます。これはテストケースのスクリプトです。私は今、次の出力を見る: "x64"、 "64ビットプラットフォーム"、 "x64"。 WMI呼び出しがローカライズされた文字列を返しているようですが、私にとっては「64ビット」です。他の小切手は、他の小切手のように広く使われています。 – ygoe

+0

'OSArchitecture'は、OSアーキテクチャに応じて、文字列' '32ビット ''または' '64ビット' 'を返します。そのため、条件をそれに合わせなければなりません。 –

3

私はあなたが関数の結果ではなく関数を比較していると思います。また、何らかの形で、エコーは関数内で期待通りに動作しません。私は通常Write-Hostを使います。

function Get-Platform() 
{ 
    # Determine current Windows architecture (32/64 bit) 
    if ([System.Environment]::GetEnvironmentVariable("ProgramFiles(x86)") -ne $null) 
    { 
     Write-Host("x64") 
     return "x64" 
    } 
    else 
    { 
     Write-Host("x86") 
     return "x86" 
    } 
} 

$platform = Get-Platform 

if ($platform -eq 'x64') 
{ 
    echo "64 bit platform" 
} 

if ($platform -eq 'x86') 
{ 
    echo "32 bit platform" 
} 
関連する問題