13

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

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 バージョンは何でも持っています。

4

2 に答える 2

22

条件付きで関数の戻り値を比較する場合は、関数呼び出しをグループ化する (つまり、括弧で囲む) か、( @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" { ... }
}

より適切でしょう。

また、関数内でのエコーも避けます。値を返すだけで、返された値で必要になる可能性のあるエコーを実行できます。関数内でエコーされたものはすべて、呼び出し元にも返されます。

最後に 1 つ: 個人的には、オペレーティング システムのアーキテクチャを決定するために、特定のフォルダーや環境変数の存在に依存したくありません。このタスクに WMI を使用すると、信頼性が大幅に向上します。

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

この関数は、オペレーティング システムのアーキテクチャに応じて、文字列"32-Bit"またはを返します。"64-Bit"

于 2013-04-10T17:40:05.817 に答える
5

関数の結果ではなく、関数を比較していると思います。また、どういうわけか、エコーは関数で期待どおりに機能しません。私は通常、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"
}
于 2013-04-10T15:30:52.687 に答える