PowerShellスクリプトを書いて、一連のパッチのインストール前のセットアップを実行しました。私は、私たちの不動産を介してクライアントコンピュータに展開しています。私の頭を包み込むことができない奇妙な問題。PowerShell - 明示的に宣言された変数にブール値を返すときにInvalidCastExceptionが発生する
セットアップパッチは、PowerShell 2.0の "機能"のために、 'C:¥Windows¥System32¥WindowsPowerShell¥v1.0¥powershell.exe.config'ファイルをチェックします。これにより、アプリケーションは.NET Framework 2.0.0をデフォルトの4.5.2ではなく、特定の機能が実行されないようにします。ファイルが存在しないか評価された値が仕様と一致しない場合は、XMLファイルを追加して必要な値を指定します。
私は実行するコマンドは次のとおりです。ただし、
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
}
}
機能を:
$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")
...とSet-PSRuntimeConfigs
方法は、PowerShellのモジュールで発見され、私は以下のコードを使用して作成しました関数の結果を$psExeXml
変数に代入しようとすると、InvalidCastExceptionが返されます。奇妙なことに、PowerShellは、$true
または$false
だけが関数から返されたにもかかわらず[System.Object()]を[Boolean]型に変換できないというエラーを返します。
私の最初の考えは、コードの問題のために関数によってスローされていますが、その機能はプロンプトでエラーを報告するように書かれており、その場合には$false
を返します...とにかく、これをどこで処理するか分からない...
こんにちは@Duncanので、 'echo'(a.k.a. Write-Host)はPowerShellコンソールに書き戻しますが、それでもオブジェクトとして返されますか? – Fredulom
あなたの間違いは、 'echo'は' Write-Host'ではなく 'Write-Output'のエイリアスです。あなたは 'Write-Host'を使ってコンソールに書き込むことができますが、' Write-Output'は最終的にコンソールに行くかもしれないし、できないかもしれない関数からの出力を生成します。 – Duncan
Duncanありがとう、代わりに 'Write-Host'にコマンドを変更します:) – Fredulom