【问题标题】:How to continue powershell script after child generated powershell scripts have finished?子生成的powershell脚本完成后如何继续powershell脚本?
【发布时间】:2020-10-05 07:48:21
【问题描述】:

我目前正在努力解决一个问题,如果有任何帮助或意见,我将不胜感激。

我有一个 powershell 脚本,它在执行期间会生成其他运行各种命令的 powershell 脚本。所有这些生成的 powershell 脚本在其命令执行后都会自动退出。

我想要做的是,在所有这些衍生的 powershell 实例退出后,在初始 powershell 脚本中运行另一个命令。基本上等待所有生成的powershell实例退出,然后运行命令。

关于如何实现它的任何想法?

谢谢

编辑:生成 powershell 脚本的代码如下所示:

foreach ($var in $filters){
    start-process powershell.exe -Verb Runas -argument "-nologo -noprofile -command .\$var"}

【问题讨论】:

  • 查看jobs
  • 感谢@JeroenMostert,但我不确定这些会有什么帮助。生成 powershell 脚本的代码如下所示 foreach ($var in $filters){start-process powershell.exe -Verb Runas -argument "-nologo -noprofile -command .\$var"} 将其放入 ScriptBlock给我一个错误
  • 你不应该把你的代码放在评论里,把它放在问题里。

标签: powershell


【解决方案1】:

您可以使用Wait-Process。使用-PassThru 开关返回已启动的进程。这应该有效:

$processes = foreach ($var in $filters) {
    Start-Process powershell.exe -PassThru -Verb RunAs -Arg "-nologo -noprofile -command .\$var"
}
# wait for processes to finish
$processes | Wait-Process
# now, run your other commands
# ...

你也可以像这样使用background jobs(使用$PWD自动变量):

# run all scripts as background jobs
$jobs = foreach ($var in $filters) {
    Start-Job -FilePath "$PWD\$var"
}
# wait for all jobs to finish
$jobs | Wait-Job
# now, run your other commands
# ...

或单行:

$filters | foreach { Start-Job -FilePath "$PWD\$_" } | Wait-Job

【讨论】:

  • @stereoscopique 是的,它可以工作,但您还应该考虑它是否真的是 最佳 解决方案并查看 PowerShell Jobs。
【解决方案2】:

您可以像 @jeorenmostert 所说的那样使用 powershell 作业尝试此操作

$j=$filters|%{
start-job -filepath "$($_)"
}
$j|wait-job
  • 这里首先使用 ForEach 的 % 别名迭代 $filters

  • 然后启动每个作业($_)是管道变量

  • 将它们放入 $j 变量中

  • $j 工作传送到 wait-job 以等待工作完成(您也可以通过管道传递 receive-job 以获得类似直通的结果)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2013-12-08
    • 2013-02-11
    • 1970-01-01
    • 2016-09-25
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多