我已经编写了一个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
......无论如何,我'陷入困境,无法弄清楚从哪里开始......
答案 0 :(得分:0)
如果函数产生任何输出,那么结果将是一个包含输出字符串的数组,然后最后一个元素将是你的布尔值。
所以对于这段代码:
echo "ERROR: Exception occurred during XML write process!"
echo "ERROR: Exception message: $($_.Exception.Message)"
return $false
该函数返回一个包含两个字符串和一个布尔值的数组。