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

会更合适。

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

最后一点:我个人宁愿不依赖特定文件夹或环境变量的存在来确定操作系统架构。使用 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 回答