2

このコードが Powershell ISE では実行されるが、Powershell コンソールからは実行されない理由を理解しようとしています。

function close-window (){
    # close
    $hash.window.Dispatcher.Invoke("Normal",[action]{ $hash.window.close() })
    # clean up
    $powershell.EndInvoke($handle) | Out-Null
    $runspace.Close() | Out-Null
    $powershell.Dispose() | Out-Null
}

    $hash = [hashtable]::Synchronized(@{})
    $runspace = [runspacefactory]::CreateRunspace()
    $runspace.ApartmentState = "STA"
    $Runspace.ThreadOptions = "ReuseThread"
    $runspace.Open()
    $runspace.SessionStateProxy.SetVariable("hash",$hash)
    $Powershell = [PowerShell]::Create()
    $powershell.AddScript({ 
    $xaml = [xml]@"
        <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="Window" Title="Splash Screen" WindowStyle="None" WindowStartupLocation="CenterScreen"
        Width="499" Height="272" BorderBrush="#FF2AA0F1" ShowInTaskbar = "False" AllowsTransparency="True"
        ResizeMode = "NoResize" BorderThickness="1" >
    </Window>
"@

    $reader = New-Object System.Xml.XmlNodeReader $xaml
    $hash.window = [Windows.Markup.XamlReader]::Load($reader)
    $hash.window.Add_MouseRightButtonUp({ $hash.window.close() })
    $hash.window.ShowDialog()
})

    $Powershell.Runspace = $runspace
    $handle = $Powershell.BeginInvoke()

ISE から実行すると、XAML ウィンドウが表示され、期待どおりの結果が得られます。ファイルを保存してコンソールから実行すると、サイレント モードで失敗する ファイルをコピーしてコンソールに貼り付けると、サイレント モードで失敗します。

同期されたハッシュ テーブルを持つ単一の実行空間が含まれています。これは XAML であるため、単一のスレッド化されたアパートメントとして実行空間を開始します。コンソールから実行する場合、MTA と STA を試しました

目的は、このコードをスプラッシュ スクリーンの一部として使用することです。

4

1 に答える 1

1

スクリプトにはアセンブリ名への参照がありませんでした。これは ISE の問題ではありませんが、コンソールには必要です。

 Add-Type -AssemblyName PresentationCore, PresentationFramework
于 2015-05-26T09:29:24.130 に答える