Start-Job PowerShell创建两个作业

时间:2019-06-13 11:56:49

标签: powershell jobs invoke-sqlcmd

我想执行一组不包含存储过程的作业,以查看将数据库设置为包含数据库后代码中是否存在任何问题。一段时间后,我想查看存储过程是否成功。但是,我看到正在创建两个作业,而不是一个存储过程的作业。如何避免创建两个工作?

$unContainedSProcs = Import-Csv -Path C:\DFLog\UnContained_Parameterless_SPs.csv
$batchSize = 50
$currentCompletedIdx = 0
$jobIds = @()
$scriptToExecute = {
    Param($storedProcToExecute)
    Invoke-Sqlcmd -Query "Exec $storedProcToExecute" -ServerInstance "<<ServerInstance>>" -Database "<<Database>>" -QueryTimeout 120
}

while ($currentCompletedIdx -le $unContainedSProcs.Length) {
    for ($i= 0; $i -le $batchSize; $i++) {
        $job = Start-Job -Name $unContainedSProcs[$i].UnContainedSProcName -ScriptBlock $scriptToExecute -ArgumentList $unContainedSProcs[$i].UnContainedSProcName
        $jobIds += $job.Id
        ++$currentCompletedIdx
    }
}

使用Get-Job查看作业列表时,我看到两个作业:

+----+--------------+------------------+-----------+---------------+--------------+------------------------------+
| Id |     Name     | PSJobTypeName    |   State   |   HasMoreData |   Location   |           Command            |
+----+--------------+------------------+-----------+---------------+--------------+------------------------------+
|  1 |   dbo.SPName | BackgroundJob    | Completed |  True         |    localhost |    param($storedProcToExe... |
| 41 |  Job41       | BackgroundJob    | Completed |  True         |    localhost |    param($storedProcToExe... |
+----+--------------+------------------+-----------+---------------+--------------+------------------------------+

1 个答案:

答案 0 :(得分:0)

我知道了。这是由于for loop条件的错误定义。当存储过程的数量为1且for循环运行两次:0、1时。这是由于-le(小于或等于)$ unContainedSProcs(1)的长度所致。

$ unContainedSProcs中只有一个条目[0]。对于第一次运行,这很好。对于第二次运行,$ unContainedSProcs中没有条目[1]。因此,正在创建空作业。将-le更改为-lt之后,仅创建一个作业。

发件人:

for ($i= 0; $i -le $batchSize; $i++) {

收件人:

for ($i= 0; $i -lt $batchSize; $i++) {