这种语言真的很奇怪。我正在尝试执行一个函数并将其结果值用作条件。这是我的代码:
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版本。
答案 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"
}