在PowerShell中调用函数的条件

时间:2013-04-10 15:23:49

标签: 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版本。

2 个答案:

答案 0 :(得分:18)

如果要比较条件函数的返回值,则必须对函数调用进行分组(即将其放在括号中)或(如建议的@FlorianGerhardt)将函数的返回值赋值给a变量并在条件中使用该变量。否则,比较运算符和另一个操作数将作为参数传递给函数(在您的情况下,它们将被静默丢弃)。然后,您的函数返回的结果既不是""也不是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" { ... }
}

会更合适。

我也避免在函数内部回显。只需返回值并执行返回值可能需要的任何回显。函数内部回显的任何内容也将返回给调用者。

最后一点:个人而言,我宁愿不依赖特定文件夹或环境变量的存在来确定操作系统架构。使用WMI完成此任务使我更加可靠:

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

此函数将返回字符串"32-Bit""64-Bit",具体取决于操作系统架构。

答案 1 :(得分:4)

我认为你正在比较一个函数而不是函数结果。也不知何故,回声在函数中不能正常工作。我通常使用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"
}