Function 调用函数时出错

Function 调用函数时出错,function,powershell,powershell-2.0,Function,Powershell,Powershell 2.0,我得到以下代码的解析错误。我们有多个应用程序环境,从最新版本到不同版本,我们希望动态检测环境-但由于某些原因,我遇到了解析错误,如ParseException和意外令牌。有人能帮忙吗?我正在使用Powershell 2.0 代码如下: param( ## The name of the software to search for $DisplayName = "*Systems Manager" ) Set-StrictMode -Off ## Get all the li

我得到以下代码的解析错误。我们有多个应用程序环境,从最新版本到不同版本,我们希望动态检测环境-但由于某些原因,我遇到了解析错误,如ParseException和意外令牌。有人能帮忙吗?我正在使用Powershell 2.0

代码如下:

param(
    ## The name of the software to search for
    $DisplayName = "*Systems Manager"
)

Set-StrictMode -Off

## Get all the listed software in the Uninstall key
$keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

## Get all of the properties from those items
$items = $keys | Foreach-Object { Get-ItemProperty $_.PsPath }

## For each of those items, display the DisplayName and Publisher
foreach ($item in $items) {
    if (($item.DisplayName) -and ($item.DisplayName -like $DisplayName)) {
        $MS = $item.DisplayVersion
    }
}

Function SyMan ($SM42) {
    #SM 1
    if ($MS –eq '11.3.0.23') {
        Write-Host “SM 1”
    #SM 2
    } elseif ($MS –eq '11.1.0.12') {
        Write-Host “SM 2”
    #SM 3
    } elseif ($MS –eq '11.0.0.26') {
        Write-Host “SM 3”
    #SM 4
    } elseif ($MS –eq '10.2.1.5') {
        Write-Host “SM 4”
    #SM 5
    } elseif ($MS –eq '10.1.1.2') {
        Write-Host “SM 5”
    #SM 6
    } else ($MS –eq '11.2.3.1') {
        Write-Host “SM 6”
    }
} #end of function 

SysMan $MS
以下是错误:

expected-token'eq'11.3.0.23'){Write-Host-oSM-1-SM-1}elseif($MS-eq'11.3.0.23)在表达式或语句中。
在C:\Tests\get\u SMVersion.ps1:38 char:24

+如果($MS?“eq”11.3.0错误消息看起来您的文件保存为UTF-8而没有BOM。请使用记事本++之类的编辑器将其打开,并将其保存为常规UTF-8(有BOM)或ANSI文本。此外,应避免使用排版字符(如排版引号、em和en破折号等)作为脚本中的语法元素。

问题在于最后一个if块

} else ($MS –eq '11.2.3.1') {
    Write-Host “SM 6”
}
不能在
else
语句中包含条件。如果要检查其他条件,只需包含另一个
elseif
语句即可

} elseif ($MS –eq '11.2.3.1') {
    Write-Host “SM 6”
}
你也应该留下一个
else
语句来解释其他的事情,这样你就可以这样结束它了

} else {
    Write-Host "Some other SM"
}

对于这种情况,我会使用开关

switch -exact ( $MS )
{
    "11.3.0.23" { Write-Host “SM 1” } #SM 1
    "11.1.0.12" { Write-Host “SM 2” } #SM 2
    "11.0.0.26" { Write-Host “SM 3” } #SM 3
    "10.2.1.5" { Write-Host “SM 4” } #SM 4
    "10.1.1.2" { Write-Host “SM 5” } #SM 5
    "11.2.3.1" { Write-Host “SM 6” } #SM 6
}

检查

请显示准确的错误消息。下面是错误:意外的标记“eq”
'11.3.0.23
'{Write Host-oSM 1-SM 1}elseif($MS?'eq'在表达式或语句中。在C:\Tests\get?SMVersion.ps1:38 char:24+IF($MS?'eq'11.3.0)我在您的问题中是指($MS?'eq'11.3.0)(单击其右下方的“编辑”链接)注释中的代码或错误消息往往无法读取。我刚刚发布了错误。我发现字符串周围有智能引号。代码中也有智能引号吗?“SM 6”应该是“SM 6”
。从我看到的情况来看,你的连字符也应该被替换。我确信你的双引号来自复制/粘贴。这种情况经常发生。很好。虽然错误消息明确表明存在编码问题,但下一步可能会出现这种情况。感谢大家的建议。这真的很好。带BOM的UTF-8也能正常工作从上一句话中删除了elseif-我通过选择ANSI也解决了这个问题。因此,两种方法都有效。感谢专家的帮助。