Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows PowerShell进程处理-在PowerShell循环中启动多个SqlPackage.exe进程_Windows_Multithreading_Powershell - Fatal编程技术网

Windows PowerShell进程处理-在PowerShell循环中启动多个SqlPackage.exe进程

Windows PowerShell进程处理-在PowerShell循环中启动多个SqlPackage.exe进程,windows,multithreading,powershell,Windows,Multithreading,Powershell,如果目标数据库存储在一个数组中,那么有没有办法启动SqlPackage.exe的工作进程,这样您就可以在其上循环(所有其他参数都是相同的) 我想禁止这些进程中的所有打印,除非出现错误,然后在最后显示一个报告。我该怎么做 现在我有一个如下循环(作为开始): 我在某处找到了启动进程,我确信我需要存储此函数返回的对象并以某种方式使用它。我希望启动所有流程,然后等待所有流程完成,在这一点上,我将调查是否所有流程都成功。如果出现故障,我希望打印该进程中的错误信息。现在所有进程都同时打印,所有进程完成后整个

如果目标数据库存储在一个数组中,那么有没有办法启动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