Я работаю над проектом, который начинается с мастера графического интерфейса, чтобы получить некоторую информацию от пользователя, такую как полное доменное имя EndPoint, имя пользователя, пароль и т. Д.
Как только пользователь предоставит всю необходимую информацию и достигнет последней страницы в графическом интерфейсе, кнопка запуска будет готова для его нажатия. После нажатия этой кнопки «Пуск» инструмент вызовет 32 различных сценария, которые расположены в отдельных файлах.
Чтобы сделать графический интерфейс более отзывчивым и преодолеть проблемы зависания, а также добавить многопоточность и лучшую производительность, я использую Runspace и RunspcaePools. Таким образом, сам графический интерфейс пользователя выполняется в Runspace, и после того, как пользователь нажмет на кнопку запуска, будет создан RunspacePool, и для каждого сценария из 32 сценариев будет создан и вызван сеанс Powershell.
Графический интерфейс работает нормально, и все работает, как ожидалось, пока кнопка запуска. Моя проблема в том, что я не могу вызвать эти файлы сценариев при добавлении сценария в сеанс PowerShell. это просто ничего не случилось. Если я использую Wait-Debugger, я не вижу никаких ошибок, это как если бы ScriptBlock, который я передаю сеансу Powershell (который имеет значение пути к скрипту, который я хочу выполнить), является просто sting, а не 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 = [scriptblock] :: Create ((Get-Content $ ScriptPath))
Кажется, ничего не работает.
Буду признателен за вашу помощь в этом.
Спасибо