Вызов блока сценария пространства выполнения Powershell из удаленного файла

Я работаю над проектом, который начинается с мастера графического интерфейса пользователя, чтобы получить некоторую информацию от пользователя, такую ​​как полное доменное имя конечной точки, имя пользователя, пароль и т. Д.

После того, как пользователь предоставит всю необходимую информацию и перейдет на последнюю страницу в графическом интерфейсе, кнопка запуска будет готова для его нажатия. После нажатия этой кнопки «Пуск» инструмент вызовет 32 различных сценария, которые находятся в отдельных файлах.

Чтобы сделать графический интерфейс более отзывчивым и преодолеть проблемы с зависанием, а также добавить многопоточность и повысить производительность, я использую Runspace и RunspcaePools. Таким образом, сам графический интерфейс работает в среде выполнения, и как только пользователь нажимает кнопку запуска, будет создан пул запуска, и для каждого сценария из 32 сценариев будет создан и запущен сеанс Powershell.

Графический интерфейс работает нормально, и все работает, как ожидалось, до кнопки запуска. Моя проблема в том, что я не могу вызывать эти файлы сценария, когда добавляю сценарий в сеанс PowerShell. это просто ничего не происходит. Если я использую Wait-Debugger, я не вижу никаких ошибок, это как если бы ScriptBlock, который я передаю сеансу Powershell (который имеет значение пути к сценарию, который я хочу выполнить), просто укус, а не ScriptBlock .

Мой код выглядит следующим образом:

    #   This Section will add all the required Subscript Files into variables to be called by the main code of the tool.
    $SubScriptFolderPath = $CurrentWorkingDirectory + "SubCode\Scripts\"
    $SubscriptFilePath = @{}
    $SubscriptFilePath.BasicVspherePowerCliData = $SubScriptFolderPath + "BasicVspherePowerCliData.ps1"
    $SubscriptFilePath.NsxManagerPowerCliData = $SubScriptFolderPath + "NsxManagerPowerCliData.ps1"
    $SubscriptFilePath.NsxManagerPowerNsxData = $SubScriptFolderPath + "NsxManagerPowerNsxData.ps1"
    $SubscriptFilePath.NsxManagerNsxCliData = $SubScriptFolderPath + "NsxManagerNsxCliData.ps1"
    $SubscriptFilePath.ControllerPowerCliData = $SubScriptFolderPath + "ControllerPowerCliData.ps1"
    $SubscriptFilePath.ControllerPowerNsxData = $SubScriptFolderPath + "ControllerPowerNsxData.ps1"
    $SubscriptFilePath.ControllerNsxCliData = $SubScriptFolderPath + "ControllerNsxCliData.ps1"
    $SubscriptFilePath.ControllerSshData = $SubScriptFolderPath + "ControllerSshData.ps1"
    $SubscriptFilePath.ClusterPowerCliData = $SubScriptFolderPath + "ClusterPowerCliData.ps1"
    $SubscriptFilePath.ClusterPowerNsxData = $SubScriptFolderPath + "ClusterPowerNsxData.ps1"
    $SubscriptFilePath.ClusterNsxApiData = $SubScriptFolderPath + "ClusterNsxApiData.ps1"
    $SubscriptFilePath.HostPowerCliData = $SubScriptFolderPath + "HostPowerCliData.ps1"
    $SubscriptFilePath.HostPowerNsxData = $SubScriptFolderPath + "HostPowerNsxData.ps1"
    $SubscriptFilePath.HostEsxCliData = $SubScriptFolderPath + "HostEsxCliData.ps1"
    $SubscriptFilePath.HostNsxCliData = $SubScriptFolderPath + "HostNsxCliData.ps1"
    $SubscriptFilePath.DvsPowerCliData = $SubScriptFolderPath + "DvsPowerCliData.ps1"
    $SubscriptFilePath.DvsPowerNsxData = $SubScriptFolderPath + "DvsPowerNsxData.ps1"
    $SubscriptFilePath.LogicalSwitchPowerCliData = $SubScriptFolderPath + "LogicalSwitchPowerCliData.ps1"
    $SubscriptFilePath.LogicalSwitchPowerNsxData = $SubScriptFolderPath + "LogicalSwitchPowerNsxData.ps1"
    $SubscriptFilePath.TransportZonePowerCliData = $SubScriptFolderPath + "TransportZonePowerCliData.ps1"
    $SubscriptFilePath.TransportZonePowerNsxData = $SubScriptFolderPath + "TransportZonePowerNsxData.ps1"
    $SubscriptFilePath.DlrPowerCliData = $SubScriptFolderPath + "DlrPowerCliData.ps1"
    $SubscriptFilePath.DlrPowerNsxData = $SubScriptFolderPath + "DlrPowerNsxData.ps1"
    $SubscriptFilePath.DlrNsxCliData = $SubScriptFolderPath + "DlrNsxCliData.ps1"
    $SubscriptFilePath.EsgPowerCliData = $SubScriptFolderPath + "EsgPowerCliData.ps1"
    $SubscriptFilePath.EsgPowerNsxData = $SubScriptFolderPath + "EsgPowerNsxData.ps1"
    $SubscriptFilePath.EsgNsxCliData = $SubScriptFolderPath + "EsgNsxCliData.ps1"
    $SubscriptFilePath.DfwPowerCliData = $SubScriptFolderPath + "DfwPowerCliData.ps1"
    $SubscriptFilePath.DfwPowerNSXData = $SubScriptFolderPath + "DfwPowerNSXData.ps1"
    $SubscriptFilePath.DumpEndPoints = $SubScriptFolderPath + "DumpEndPoints.ps1"


    #   Create  Sync HashTable (GuiHash) to allow readability across different Runscpases and add required variables.
    $Global:GuiHash = [hashtable]::Synchronized(@{ })
    $Global:GuiHash.IPCehckPattern = $IPRegex   #   Add the IPCehckPattern Variable to be used within other runspaces
    $Global:GuiHash.SubscriptFilePath = $SubscriptFilePath  #   Add the SubCodePaths Variable to be used within other runspaces

    #   Crate the Runspace that will be used for the GUI and configure settings. After, Open the Runspace and import variables.
    #   You must import variables that will be used in other Runspaces, thus importing the required variables to this Runspace.
    $GuiRunspace =[runspacefactory]::CreateRunspace()
    $GuiRunspace.ApartmentState = "STA"
    $GuiRunspace.ThreadOptions = "ReuseThread"         
    $GuiRunspace.Open()
    $GuiRunspace.SessionStateProxy.SetVariable("GuiHash",$Global:GuiHash)  
    $GuiRunspace.SessionStateProxy.SetVariable("XamlFilesArray",$XamlFilesArray)

    #   Create a PowerShell Session and add it to the Runspace.
    $GuiPSSession = [PowerShell]::Create()
    $GuiPSSession.Runspace = $GuiRunspace

    #   Create the GUI PowerShell Session ScriptBlock. This will be the main code of the tool.
    [void]$GuiPSSession.AddScript({

          [Some code that is taking care of GUI]

          $GuiHash.WizardFinalPageStart.Add_Click({

               #    Create Session State Object and Add GuiHash Variable to it
               $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
               $RunHash = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'RunHash',$Global:GuiHash,$Null
               $InitialSessionState.Variables.Add($RunHash)
               #  Create Runspace Pool
               $RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, [int]$env:NUMBER_OF_PROCESSORS + 1, $InitialSessionState, $Host)
               $RunspacePool.ApartmentState = "MTA"  
               $RunspacePool.Open()
               ForEach ($ScriptBlock in $Global:GuiHash.SubscriptFilePath) {
                    $PowerShellSession = [PowerShell]::Create()
                    $PowerShellSession.RunspacePool = $RunspacePool 
                    $PowerShellSession.AddScript({$ScriptBlock})
                    $PowerShellSession.BeginInvoke()
               }
          })

        #   Show Wizard Window.
        $Global:GuiHash.WizardMainWindow.ShowDialog() | Out-Null
    })  

    $ShowGui = $GuiPSSession.BeginInvoke()

Я пробовал много чего, например:

  • Добавление & в начало пути к скрипту.

  • Добавление. в начало пути к скрипту.

  • Использование Get-Content

  • Использование системного объекта ScriptBlock

    $ Scriptblock = [блок сценария] :: Create ((Get-Content $ ScriptPath))

Кажется, ничего не работает. Буду признателен за вашу помощь в этом.

Спасибо


person Taher Shaker    schedule 30.05.2019    source источник


Ответы (1)


Я думаю, что снова сделал ту же ошибку, извините, этот проект иногда заставляет меня зависать. При вызове блока скрипта скобки нужно убрать. поэтому вам нужно вызвать блок скрипта, как показано ниже

$PowerShellSession.AddScript($ScriptBlock)
person Taher Shaker    schedule 30.05.2019