PowerShell脚本结果不一致

时间:2017-07-12 20:56:15

标签: powershell

我有一个powershell脚本,它运行一个invokesqlcmd语句并计算返回行中的行数,并根据该数字创建一个变量。如果有一行或两行,它应该只关闭,具体取决于是否返回错误(预期会有一些错误),但是在有三行的情况下它已关闭了几次。我希望它关闭,如果唯一的值是"成功"它通常会关闭。和"失败"但它已经以" Processing"的第三个值结束了。

这是脚本的相关部分。

$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}
            }

}   

我是否在某种程度上混淆了我的测试逻辑条件?

1 个答案:

答案 0 :(得分:2)

您正在多次调用sql命令 way 。调用一次,将结果捕获到变量中,针对该变量运行测试。

$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个结果。过去你想要做的事情有点令人困惑。你的代码说:

如果有2个结果,并且' statusname'一个属性是“成功”,另一个属于“失败”,然后输出到GridView。 如果只有一个结果,那么' statusname'财产是“成功”和“成功”。或者'失败'然后输出到GridView。

这对我来说似乎有瑕疵。如果有2个结果,并且它们都成功或者都失败了怎么办?如果只有1个结果,它是否可能是成功或失败以外的任何其他结果?您是否需要在While测试中添加更多子句?是否需要等到没有处理?也许这会更好:

$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