2017-03-15 11 views
0

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を返します...とにかく、これをどこで処理するか分からない...

答えて

0

この関数が出力を生成する場合、結果は出力された文字列を含む配列になり、最後の要素はブール値になります。このコードのためにそう

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

関数は二つの文字列とブール値の配列を返します。

+0

こんにちは@Duncanので、 'echo'(a.k.a. Write-Host)はPowerShellコンソールに書き戻しますが、それでもオブジェクトとして返されますか? – Fredulom

+0

あなたの間違いは、 'echo'は' Write-Host'ではなく 'Write-Output'のエイリアスです。あなたは 'Write-Host'を使ってコンソールに書き込むことができますが、' Write-Output'は最終的にコンソールに行くかもしれないし、できないかもしれない関数からの出力を生成します。 – Duncan

+0

Duncanありがとう、代わりに 'Write-Host'にコマンドを変更します:) – Fredulom

関連する問題