PowerShell - 将Boolean返回到显式声明的变量时出现InvalidCastException

时间:2017-03-15 14:13:48

标签: powershell exception

我已经编写了一个PowerShell脚本来执行一些预安装设置,用于我正在部署到我们房地产的客户端计算机的一系列补丁中,我遇到了一个奇怪的问题,我无法将其包裹起来到处走走。

安装补丁检查'C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe.config'文件,因为PowerShell 2.0的“功能”,默认情况下应用程序使用.NET Framework 2.0.0而不是4.5.2,阻止某些功能被执行。如果文件不存在或评估值与规范不匹配,我添加XML文件并提供必要的值。

我运行的命令如下:

$psConfigDir = "C:\Windows\System32\WindowsPowerShell\v1.0"
$psConfigFileName = "powershell.exe.config"

[boolean]$psExeXml = Set-PSRuntimeConfigs -FilePath ( [String]::Format("{0}\{1}", $psConfigDir, $psConfigFileName) ) -CLRVersions @("v4.0.30319", "v2.0.50727")

...我在使用以下代码创建的PowerShell模块中找到了Set-PSRuntimeConfigs方法:

Function Set-PSRuntimeConfigs {
    [CmdletBinding()]
    Param(
            [String]$FilePath,
            [System.Collections.ArrayList]$CLRVersions
         )

    Try {
        $xmlWriter = New-Object System.Xml.XmlTextWriter($FilePath, $null)
        $xmlWriter.Formatting = "Indented"
        $xmlWriter.Indentation = 4

        $xmlWriter.WriteStartDocument()
        $xmlWriter.WriteStartElement("configuration")

        $xmlWriter.WriteStartElement("startup")
        $xmlWriter.WriteAttributeString("useLegacyV2RuntimeActivationPolicy", $true)

        $CLRVersions | ForEach-Object {
            $xmlWriter.WriteStartElement("supportedRuntime")
            $xmlWriter.WriteAttributeString("version", $_)
            $xmlWriter.WriteEndElement()
        }

        $xmlWriter.WriteEndElement()
        $xmlWriter.WriteEndElement()
        $xmlWriter.WriteEndDocument()

        $xmlWriter.Close()
        $xmlWriter.Dispose()

        return $true
    } Catch {
        echo "ERROR: Exception occurred during XML write process!"
        echo "ERROR: Exception message: $($_.Exception.Message)"
        return $false
    }
}

但是,当尝试将函数的结果分配给$psExeXml变量时,该函数返回InvalidCastException。奇怪的是,PowerShell返回时返回错误,指出[System.Object()]无法转换为[Boolean]类型,尽管事实上只返回{​​{1}}或$true

我的第一个想法是由于代码问题导致函数抛出异常,但编写该函数是为了在提示中报告错误并在这种情况下返回$false ......无论如何,我'陷入困境,无法弄清楚从哪里开始......

1 个答案:

答案 0 :(得分:0)

如果函数产生任何输出,那么结果将是一个包含输出字符串的数组,然后最后一个元素将是你的布尔值。

所以对于这段代码:

    echo "ERROR: Exception occurred during XML write process!"
    echo "ERROR: Exception message: $($_.Exception.Message)"
    return $false

该函数返回一个包含两个字符串和一个布尔值的数组。