Windows PowerShell进程处理-在PowerShell循环中启动多个SqlPackage.exe进程
如果目标数据库存储在一个数组中,那么有没有办法启动SqlPackage.exe的工作进程,这样您就可以在其上循环(所有其他参数都是相同的) 我想禁止这些进程中的所有打印,除非出现错误,然后在最后显示一个报告。我该怎么做 现在我有一个如下循环(作为开始): 我在某处找到了Windows PowerShell进程处理-在PowerShell循环中启动多个SqlPackage.exe进程,windows,multithreading,powershell,Windows,Multithreading,Powershell,如果目标数据库存储在一个数组中,那么有没有办法启动SqlPackage.exe的工作进程,这样您就可以在其上循环(所有其他参数都是相同的) 我想禁止这些进程中的所有打印,除非出现错误,然后在最后显示一个报告。我该怎么做 现在我有一个如下循环(作为开始): 我在某处找到了启动进程,我确信我需要存储此函数返回的对象并以某种方式使用它。我希望启动所有流程,然后等待所有流程完成,在这一点上,我将调查是否所有流程都成功。如果出现故障,我希望打印该进程中的错误信息。现在所有进程都同时打印,所有进程完成后整个
启动进程
,我确信我需要存储此函数返回的对象并以某种方式使用它。我希望启动所有流程,然后等待所有流程完成,在这一点上,我将调查是否所有流程都成功。如果出现故障,我希望打印该进程中的错误信息。现在所有进程都同时打印,所有进程完成后整个缓冲区都会损坏
这在PowerShell中可能吗
PS:该脚本旨在稍后使用.dacpac文件将更新部署到生产环境中,但这个问题与Windows进程和错误的处理密切相关
编辑:我可能需要一种方法来一次创建和维护最大数量的进程,并在某些进程完成时进行交换。因此,假设在任何时候,我可能只有10个SqlPackage.exe进程连接到服务器。如何在PowerShell中创建这样一个
屏障锁(我想这就是它的名称)?我认为您可以将PowerShell作业合并为以下内容,将每个任务推送到后台作业中,然后使用等待作业
等待它们完成,然后通过接收作业
返回输出:
$arguments = @(
"/Action:Import",
"/SourceFile:$($bacpacSource)",
"/TargetServerName:$($serverName)"
)
for ($i = 1; $i -lt 4; $i++) {
$targetDatabase = $baseDatabaseName + $i
$arguments += "/TargetDatabaseName:$($targetDatabase)"
Start-Job -ScriptBlock { Start-Process -FilePath $sqlPackagePath $arguments -NoNewWindow -PassThru }
}
Get-Job | Wait-Job | Receive-Job
看看乔布斯:这就是我在听了你的评论后现在所做的。我只需要找出如何检查任何给定的作业是否已崩溃,以便检查ExitCode和错误。我可以用乔布斯来做吗?现在,您将其包装在作业中,而我只是将其切换回以前的版本,我有&$sqlPackage$arguments
(并且我还在ScriptBlock中重新声明参数($arguments),因为它似乎无法访问外部范围,并使用-ArgumentList(,$arguments))传递它们在一些实验之后,我想我必须有某种屏障方法,或者一组工人和一组任务(我可以用与上面相同的方式生成)。
$arguments = @(
"/Action:Import",
"/SourceFile:$($bacpacSource)",
"/TargetServerName:$($serverName)"
)
for ($i = 1; $i -lt 4; $i++) {
$targetDatabase = $baseDatabaseName + $i
$arguments += "/TargetDatabaseName:$($targetDatabase)"
Start-Job -ScriptBlock { Start-Process -FilePath $sqlPackagePath $arguments -NoNewWindow -PassThru }
}
Get-Job | Wait-Job | Receive-Job