Пуск-Процесс и powershell.exe с брызгами - PullRequest
0 голосов
/ 30 сентября 2019

Я уже несколько дней пытаюсь создать многопоточную оболочку WPF GUI, которая будет запускать скрипт PS3.0 после нажатия кнопки. Я не могу использовать start-job, так как мне придется отслеживать (несколько сессий одновременно), однако я хотел бы просто запустить скрипт в отдельном процессе PS - как если бы я открывал несколько экземпляров скрипта изярлык. И иметь возможность просто иметь открытое окно PS, которое будет отслеживать ход выполнения самого скрипта.

Ожидаемые результаты: запуск скрипта в сеансе powershell.exe и передача 3 аргументов - 2 строки и 1 логическое значение. Которые предоставляются пользователем.

Так в ISE:

C:\temp\test.ps1 -argumentlist $computername $username $citrixtest

Работает нормально. Я потратил несколько часов, просматривая Интернет, только чтобы найти нить, в которой рекомендовано стартовое задание или способ использования фонового работника - это не то, чего я хочу от сценария.

Так что япредположил бы, что вызов от нажатия кнопки был бы чем-то подобным (некоторые вещи, которые я пробовал)

$ComputerName = "testtext1"
$UserName = "testtext2"
$CitrixTest = $True

$command = "c:\temp\test.ps1"
$arg = @{
    Computername = "$computername";
    Username = "$username";
    CitrixTest = "$citrixtest"
}

#$WPFStartButton.Add_Click({
    Start-Process powershell -ArgumentList "-noexit -command & {$command} -argumentlist $arg"
#})

Не передает аргументы в test.ps1 - однако, это добирается до "pause "- так скрипт успешно запускается.

Где test.ps1

$ComputerName 
$UserName 
$CitrixTest 
pause

Вызывающий:

function Caller {
Param (
    $ScriptPath = "c:\temp\test.ps1"
)

$Arguments = @()
$Arguments += "-computername $ComputerName"
$Arguments += "-UserName $UserName"
$Arguments += "-citrixtest $citrixtest"
$StartParams = @{   
    ArgumentList = "-File ""$ScriptPath""" + $Arguments
}
    Start-Process powershell @StartParams
}
Caller

Не запускает скрипт вообще - окно PS простозакрывает - возможно, путь к сценарию .ps1 не найден.

И запускается другой подход, который также используется в сценарии, но не передает аргументы

$scriptFile = '"C:\temp\test.ps1"'
[string[]]$argumentList = "-file"
$argumentList +=  $scriptFile
$argumentlist += $computername
$argumentlist += $UserName
$argumentlist += $CitrixTest

$start_Process_info =  New-Object System.Diagnostics.ProcessStartInfo
$start_Process_info.FileName = "$PSHOME\PowerShell.exe"
$start_Process_info.Arguments = $argumentList


$newProcess = New-Object System.Diagnostics.Process
$newProcess.StartInfo = $start_Process_info

$newProcess.Start() | Out-Null

Есть ли способ сделатьэта работа как я хочу? Или мне просто покопаться глубже в пространствах проб и попробовать с этим?

1 Ответ

0 голосов
/ 30 сентября 2019

@ Bill_Stewart Я только что понял, что не включил параметр (аргументы) в свой сценарий ... И поэтому он не будет тянуть эти переменные так, как мне бы хотелось. Когда я вернусь в офис, мне придется проверить, просто ли это то, чего мне не хватало.

Проверено на моем ноутбуке, на котором работает PS 5.1, и похоже, что оно работает как положено

$testarg = @(
    '-File'
    "C:\temp\test.ps1"
    "$computername"
    "$username"
    "$citrixtest"
)

Start-Process powershell.exe -ArgumentList $testarg

Где test.ps1:

param(
$ComputerName,
$UserName,
$citrixtest
)

$ComputerName 
$UserName 
$CitrixTest 
pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...