PowerShell脚本结果不一致

PowerShell脚本结果不一致,powershell,Powershell,我有一个powershell脚本,它运行invokesqlcmd语句,计算返回中的行数,并基于该行数创建一个变量。仅当有一行或两行时,它才应该关闭,这取决于是否返回了错误(预计会有一些错误),但有几次它在仍有三行时关闭。我希望它关闭,如果只有“成功”和“失败”两个值,它通常会关闭,但它已经用第三个值“处理”关闭 以下是脚本的相关部分 $var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\upda

我有一个powershell脚本,它运行invokesqlcmd语句,计算返回中的行数,并基于该行数创建一个变量。仅当有一行或两行时,它才应该关闭,这取决于是否返回了错误(预计会有一些错误),但有几次它在仍有三行时关闭。我希望它关闭,如果只有“成功”和“失败”两个值,它通常会关闭,但它已经用第三个值“处理”关闭

以下是脚本的相关部分

$var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\updated-selectstatus.sql" |measure-object -line|select-object -expandproperty lines

while ($var -ge 1)
{
        $var = invoke-sqlcmd -ServerInstance "$server" -database "$db" inputfile "$updated-selectstatus.sql" |measure-object -line|select-object -expandproperty lines
                clear-host
                invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"
                Start-Sleep -Seconds 5
        if ($var -eq 2){
            if ((invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"|select-object -expandproperty statusname|select-string -simplematch successful) -and (invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"|select-object -expandproperty statusname|select-string -simplematch failure)) {invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"|out-gridview; break}
                }
            if ($var -eq 1){
            if ((invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"|select-object -expandproperty statusname|select-string -simplematch successful) -or (invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"|select-object -expandproperty statusname|select-string -simplematch failure)) {invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"|out-gridview; break}
            }

}   

我有没有搞乱了我的测试逻辑条件?

你调用sql命令的次数太多了。调用一次,捕获变量中的结果,对该变量运行测试

$var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"

while ($var.count -gt 2) {
    Start-Sleep -Second 5
    $var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"
}
它运行您的sql查询,然后如果结果超过2个,它将等待5秒并重试,直到结果不超过2个。过去,这是一个有点困惑你想做什么。你的密码是:

如果有两个结果,其中一个的“statusname”属性为“Success”,另一个为“Failure”,则输出到GridView。 如果只有一个结果,并且“statusname”属性为“成功”或“失败”,则输出到GridView

这在我看来似乎有缺陷。如果有两个结果,它们都是成功的,或者都是失败的呢?如果只有一个结果,除了成功或失败之外,还有可能吗?您是否需要在测试时向
添加更多子句?是否需要等待,直到没有任何处理?也许这样更好:

$var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\updated-selectstatus.sql" 
While($var.count -gt 2 -or $var.statusname -contains 'Processing'){
    Start-Sleep -Seconds 5
    $var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\updated-selectstatus.sql" 
}
$var | Out-GridView
更新:循环直到所有响应成功或失败的一种方法是筛选出所有成功或失败的对象,然后查看是否还有剩余内容。看看这是否能更好地满足您的需求:

$var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\updated-selectstatus.sql" 
While(($var|Where{$_.statusname -notmatch 'SUCCESSFUL|FAILURE'}).count -gt 0){
    Start-Sleep -Seconds 5
    $var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\updated-selectstatus.sql" 
}
$var | Out-GridView

您多次调用该sql命令。调用一次,捕获变量中的结果,对该变量运行测试

$var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"

while ($var.count -gt 2) {
    Start-Sleep -Second 5
    $var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "$updated-selectstatus.sql"
}
它运行您的sql查询,然后如果结果超过2个,它将等待5秒并重试,直到结果不超过2个。过去,这是一个有点困惑你想做什么。你的密码是:

如果有两个结果,其中一个的“statusname”属性为“Success”,另一个为“Failure”,则输出到GridView。 如果只有一个结果,并且“statusname”属性为“成功”或“失败”,则输出到GridView

这在我看来似乎有缺陷。如果有两个结果,它们都是成功的,或者都是失败的呢?如果只有一个结果,除了成功或失败之外,还有可能吗?您是否需要在测试时向
添加更多子句?是否需要等待,直到没有任何处理?也许这样更好:

$var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\updated-selectstatus.sql" 
While($var.count -gt 2 -or $var.statusname -contains 'Processing'){
    Start-Sleep -Seconds 5
    $var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\updated-selectstatus.sql" 
}
$var | Out-GridView
更新:循环直到所有响应成功或失败的一种方法是筛选出所有成功或失败的对象,然后查看是否还有剩余内容。看看这是否能更好地满足您的需求:

$var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\updated-selectstatus.sql" 
While(($var|Where{$_.statusname -notmatch 'SUCCESSFUL|FAILURE'}).count -gt 0){
    Start-Sleep -Seconds 5
    $var = invoke-sqlcmd -ServerInstance "$server" -database "$db" -inputfile "C:\updated-selectstatus.sql" 
}
$var | Out-GridView

谢谢你的反馈。我将使用.count来清理脚本。我使用了第二个invoke命令,因为循环从未结束,因为一旦执行开始就没有计算。对于这个问题的其余部分,我可能在我最初的帖子中不是最清楚的。此脚本监视sql server上运行的数据加载作业。大约有2000+/-个事务,通常以大约5或6个错误结束,其余事务成功。至少在我看来,这两条IF语句都是在sql命令仅返回成功和/或失败结果时才终止的。我已经更新了答案,看看这是否对您更有效。我已经实现了您的更新,看起来它成功了。非常感谢。谢谢你的反馈。我将使用.count来清理脚本。我使用了第二个invoke命令,因为循环从未结束,因为一旦执行开始就没有计算。对于这个问题的其余部分,我可能在我最初的帖子中不是最清楚的。此脚本监视sql server上运行的数据加载作业。大约有2000+/-个事务,通常以大约5或6个错误结束,其余事务成功。至少在我看来,这两条IF语句都是在sql命令仅返回成功和/或失败结果时才终止的。我已经更新了答案,看看这是否对您更有效。我已经实现了您的更新,看起来它成功了。非常感谢你。