我有一个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}
}
}
我是否在某种程度上混淆了我的测试逻辑条件?
答案 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