2017-07-12 80 views
0

我有一個運行invokesqlcmd語句的powershell腳本,並計算返回中的行數並根據該數字創建一個變量。它應該只在有一行或兩行時關閉,具體取決於是否返回了錯誤(預計會出現一些錯誤),但是在仍有三行時它已關閉幾次。我希望它關閉,如果唯一的值是「成功」和「失敗」,但通常以第三個「處理」值關閉,則通常會關閉。不一致的PowerShell腳本結果

這是腳本的相關部分。

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

} 

我不知何故混亂了我的測試邏輯條件?

回答

2

您正在調用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分的結果。過去,這是有點混淆你想要做的事情。你的代碼如下所示:

如果有2個結果,並且其中一個的'statusname'屬性爲'Success',另一個爲'Failure',則輸出到GridView。 如果只有一個結果,並且'statusname'屬性是'Success'或'Failure',則輸出到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 
+0

感謝您的反饋意見。我將使用.count來清理腳本。我有第二個invoke命令,因爲循環從未結束,因爲一旦執行開始就沒有評估。對於問題的其餘部分,我可能並不是我原來的帖子中最清楚的。該腳本監視在sql server上運行的數據加載作業,大約有2000 +/-事務,通常以大約5或6個錯誤結束,其餘都是成功的。至少在我腦海中,這兩個IF語句都被編寫爲僅在sql命令返回SUCCESSFUL和/或FAILURE結果時終止。 – ShellGames

+0

我已經更新了我的答案,看看這是否對你更好。 – TheMadTechnician

+0

我已經實現了你的更新,它看起來就是這樣做的。非常感謝。 – ShellGames