2013-04-10 45 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" 
} 
... 

BTW,你應該避免使用單獨的if語句是相互排斥的條件。對於平臺檢查一個if..then..elseif

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

switch聲明

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

會更合適。

我也避免在函數內部回顯。只需返回值並執行返回值中可能需要的任何回顯。任何在函數內部回顯的東西也會返回給調用者。

最後一點:個人而言,我寧願不依賴特定文件夾或環境變量的存在來確定操作系統體系結構。使用WMI此任務認爲我有很多更可靠:

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

這個函數會返回一個字符串"32-Bit""64-Bit",這取決於操作系統的架構。

+0

謝謝您的完整解釋。在函數名稱周圍使用圓括號確實可以調用函數,所以這看起來像是解決這些問題的通用方法。比使用其他變量名稱更簡單。 函數中的回顯(由Write-Host替代爲功能)僅用於跟蹤目的。這是一個測試用例腳本。雖然我現在看到以下輸出:「x64」,「64位平臺」,「x64」。 WMI調用似乎返回一個本地化的字符串,對我來說它是「64位」。其他支票在其他地方看起來很廣泛。 – ygoe 2013-04-11 07:38:21

+0

根據操作系統架構的不同,OSArchitecture會返回一個字符串「32位」或「64位」,因此您必須調整條件。 – 2013-04-11 11:19:49

3

我想你是在比較一個函數而不是函數的結果。另外某種方式回聲不能按預期在函數中工作。我通常使用寫主機。

這裏是我的解決問題的方法:

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