带有启动的Start-Process和powershell.exe

时间:2019-09-30 16:36:13

标签: powershell

我已经尝试了几天,对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-,而是进入“暂停”状态-因此脚本成功启动。

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 :(得分:0)

@Bill_Stewart我只是意识到我没有将param(args)放在我的脚本中... 这就是为什么它不会像我希望的那样拉那些变量。我将不得不检查我何时回到办公室,是否只是我所缺少的。

在我的运行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