>source

프로젝트를 진행 중입니다.이 프로젝트는 WPF GUI Wizard를 기반으로합니다. 이 도구의 주요 아이디어는 사용자에게 일부 데이터를 입력하도록 요청하고 동시에 제공된 데이터를 확인하는 것입니다. 그런 다음 사용자가 모든 마법사 페이지에서 필요한 모든 데이터를 입력 한 후 도구는 아래 첨자를 호출하여 기능을 수행합니다. 글쎄, WPF는 응답하지 않고 PowerShell을 응답하지 않으며이를 극복하기 위해서는 실행 공간을 사용해야합니다. 그래서 내가하고있는 일은 GUI에서 실행할 실행 영역을 연 다음 마법사를 사용하여 사용자가 입력을 제공 할 때마다 다른 실행 영역 에서이 입력의 유효성을 검사하는 것입니다.

내 문제는 사용자가 입력을 제공 할 때마다 GUI 실행 영역에서 사용자 입력을 볼 수 있지만 다른 실행 영역을 호출 할 때 여전히 WPF 개체를 볼 수 있지만이 개체에 제공된 입력을 사용할 수 없다는 것입니다.

자세한 설명 아래는 GUI의 첫 번째 입력 상자의 스크린 샷이며 예를 들어 (somqfqdn.anything)과 같은 입력을 한 다음 제출을 클릭합니다. GUI 자체는 GuiRunspace라는 실행 영역에서 실행 중입니다. 제출 버튼을 클릭하면 MPSB1Runspace라는 다른 실행 영역을 작성하고 2 개의 검사를 수행합니다 (입력이 비어 있지 않고 제공된 FQDN을 확인할 수 있음).

Runspace Debug에 갔다면 GuiRunspace에서 Inputbox Text를 확인하면 입력 (somqfqdn.anything)을 볼 수 있지만 MPSB1Runspace로 이동하여 Inputbox Text를 확인하면 비어 있습니다.

Powershell Runspace 디버깅은 다음과 같습니다 :

PS C:\Users\Administrator> Debug-Runspace Runspace32
Debugging Runspace: Runspace32
To end the debugging session type the 'Detach' command at the debugger prompt, or type 'Ctrl+C' otherwise.
Stopped at: $MPSB1Runspace = [runspacefactory]::CreateRunspace()
[DBG]: [Process:5900]: [Runspace32]: PS C:\Users\Administrator>> $GuiHash.WizardMainPageInputBox1.Text
somqfqdn.anything
[DBG]: [Process:5900]: [Runspace32]: PS C:\Users\Administrator>> 
Stopped at: $MPSB1PSSesion = [powershell]::Create()
[DBG]: [Process:5900]: [Runspace32]: PS C:\Users\Administrator>> 
Stopped at: $MPSB1PSSesion.runspace = $MPSB1Runspace
[DBG]: [Process:5900]: [Runspace32]: PS C:\Users\Administrator>> 
Stopped at: $MPSB1Runspace.Open()
[DBG]: [Process:5900]: [Runspace32]: PS C:\Users\Administrator>> 
Stopped at: $MPSB1Runspace.SessionStateProxy.SetVariable("GuiHash",$Global:GuiHash)
[DBG]: [Process:5900]: [Runspace32]: PS C:\Users\Administrator>> 
Stopped at: [void]$MPSB1PSSesion.AddScript({
[DBG]: [Process:5900]: [Runspace32]: PS C:\Users\Administrator>> 
Stopped at: })
[DBG]: [Process:5900]: [Runspace32]: PS C:\Users\Administrator>> 
PS C:\Users\Administrator> Debug-Runspace Runspace34
Debugging Runspace: Runspace34
To end the debugging session type the 'Detach' command at the debugger prompt, or type 'Ctrl+C' otherwise.
Stopped at: If ($GuiHash.WizardMainPageInputBox1.Text.Length -Eq 0) {
[DBG]: [Process:5900]: [Runspace34]: PS C:\Users\Administrator>> $GuiHash.WizardMainPageInputBox1.Text
[DBG]: [Process:5900]: [Runspace34]: PS C:\Users\Administrator>> $Global:GuiHash.WizardMainPageInputBox1.Text

또한 다른 제출 단추를 비활성화하기 위해 MPSB1Runspace에 코드 줄을 추가했지만이 조치가 수행되지 않습니다. 즉, MPSB1Runspace가 SyncHash에 액세스 할 수 없음을 의미합니다. SyncHash를 MPSB1Runspace에 추가했습니다 SessionStateProxy.SetVariable 사용.

내 코드는 다음과 같습니다 :

#   Create an Array that will hold all the XAML pages variables.
$XamlFilesArray = @($WizardMainWindowXaml, $WizardMainPageXaml, $WizardVCPageXaml, $WizardHostingVCPageXaml, $WizardControllerPageXaml, $WizardPrimaryNsxPageXaml, $WizardPrimaryVCPageXaml, $WizardFinalPageXaml)
#   Create  Sync HashTable (GuiHash) to allow readability across different Runscpases and add required variables.
$Global:GuiHash = [hashtable]::Synchronized(@{ })
#   Crate the Runspace that will be used for the GUI
$GuiRunspace =[runspacefactory]::CreateRunspace()
$GuiRunspace.ApartmentState = "STA"
$GuiRunspace.ThreadOptions = "ReuseThread"         
$GuiRunspace.Open()
$GuiRunspace.SessionStateProxy.SetVariable("GuiHash",$Global:GuiHash) 
#   Create a PowerShell Session and add it to the Runspace.
$GuiPSSession = [PowerShell]::Create()
$GuiPSSession.Runspace = $GuiRunspace
#   Create the GUI PowerShell Session ScriptBlock.
[void]$GuiPSSession.AddScript({
    ####Some the rest of the code that will build the GUI and load XAML Files
    #   Configure WizardMainPageSubmitButton1
    $GuiHash.WizardMainPageSubmitButton1.Add_Click({
        # Create new Runspace for this task. 
        $MPSB1Runspace = [runspacefactory]::CreateRunspace()
        $MPSB1PSSesion = [powershell]::Create()
        $MPSB1PSSesion.runspace = $MPSB1Runspace
        $MPSB1Runspace.Open()
        $MPSB1Runspace.SessionStateProxy.SetVariable("GuiHash",$Global:GuiHash)
        [void]$MPSB1PSSesion.AddScript({
            If ($GuiHash.WizardMainPageInputBox1.Text.Length -Eq 0) {
                $GuiHash.WizardMainPageErrorMessage.Dispatcher.Invoke([action]{$GuiHash.WizardMainPageErrorMessage.Foreground= "Red"})  #   Make Sure Printing Color is Red.
                $GuiHash.WizardMainPageErrorMessage.Dispatcher.Invoke([action]{$GuiHash.WizardMainPageErrorMessage.Text = "Provided Data is empty, please provide NSX FQDN."})  #   Print Error
            }   Else {
                    # Check if the input FQDN from WizardMainPageInputBox1 is resolvable and if not print error
                    If (!(Resolve-DnsName -Name $GuiHash.WizardMainPageInputBox1.Text.Text -ErrorAction SilentlyContinue)) {
                        $GuiHash.WizardMainPageErrorMessage.Dispatcher.Invoke([action]{$GuiHash.WizardMainPageErrorMessage.Foreground= "Red"})  #   Make Sure Printing Color is Red.
                        $GuiHash.WizardMainPageErrorMessage.Dispatcher.Invoke([action]{$GuiHash.WizardMainPageErrorMessage.Text = "Provided NSX FQDN is not resolvable. Please try again."})    #   Print Error                  
                    }   Else {
                            # Print Success, enable WizardMainPageInputBox2
                            $GuiHash.WizardMainPageErrorMessage.Dispatcher.Invoke([action]{$GuiHash.WizardMainPageErrorMessage.Foreground= "White"})        #   Make Sure Printing Color is White.
                            $GuiHash.WizardMainPageErrorMessage.Dispatcher.Invoke([action]{$GuiHash.WizardMainPageErrorMessage.Text = "Provided NSX FQDN confirmed. Please provide credentials."})  #   Print Message
                            $GuiHash.WizardMainPageInputBox2.Dispatcher.Invoke([action]{$GuiHash.WizardMainPageInputBox2.IsEnabled= "True"})    #   Enable WizardMainPageInputBox2 to continue
                        }
                }   
        }).BeginInvoke()   
    }).BeginInvoke()  
    #   Show Wizard Window.
    $Global:GuiHash.WizardMainWindow.ShowDialog() | Out-Null
}).BeginInvoke()    
$ShowGui = $GuiPSSession.BeginInvoke()

위 코드와 somefqdn.anything을 입력하면 제공된 NSX FQDN을 확인할 수 없다는 오류가 표시됩니다. 다시 시도하십시오.

도움을 주셔서 감사합니다.

  • 답변 # 1

    일부 테스트 후이 문제를 해결할 수있었습니다. 두 번째 runspace를 호출 할 때 텍스트 상자의 내용을 다른 변수로 전달하고 두 번째 reunspace setvariable에 추가했습니다

    아래와 같은 코드 :

                   $MPSB1Runspace = [runspacefactory]::CreateRunspace()
                    $MPSB1PSSesion = [powershell]::Create()
                    $MPSB1PSSesion.runspace = $MPSB1Runspace
                    $MPSB1Runspace.Open()
                    $MPSB1Runspace.SessionStateProxy.SetVariable("GuiHash",$Global:GuiHash)
                    $MPSB1Runspace.SessionStateProxy.SetVariable("NsxFqdn",$Global:GuiHash.WizardMainPageInputBox1.Text)
                    [void]$MPSB1PSSesion.AddScript({
                           your code goes here and now $NsxFqdn have the input value
                    })
    
    

  • 이전 python - 팬더에서 다른 데이터 프레임 기준 날짜 시간의 열을 매핑하는 방법
  • 다음 노드 대신 도커 노드 그룹의 균형 도커 서비스