首页 > 解决方案 > 处理 powershell 工作流和循环中的错误

问题描述

我有一个循环服务器列表的 Ps 脚本,但是错误处理的行为不像我期望的那样。invoke-sqlcmd 已设置为在出错时继续,这是故意的,因为在遍历服务器列表时,我不希望它在每次遇到错误时都停止。另一方面,我想知道是否有错误。

我选择做的是将 erroractionpreference 设置为在脚本中继续,但将 invoke-sqlcmd 命令设置为停止。这在 powershell 工作流程之外运行良好,但在 PS 工作流程中它会产生不良影响,即如果我从控制台运行 powershell 脚本,如果错误操作设置为继续,我看不到任何错误,如果设置为停止,那么我可以查看错误。

在下面的示例中,我取出了 try catch,因为它掩盖了错误。

Workflow RunDeployment
    { 


$file_list = @("deployment_1.sql","deployment_2.sql","deployment_3.sql","deployment_4.sql","deployment_5.sql")

$x = (1,"localhost\DEV2",3,1),(4,"localhost\DEV2",6,2),(3,"localhost\DEV2",4,3)
$k = 'serverid','servername','locationid','appid'     
$h = @{}
  
  
For($i=0;$i -lt $x[0].length; $i++){
    $x |
        ForEach-Object{
            [array]$h.($k[$i]) += [string]$_[$i]
        }
           
           
} 

$folder = "C:\Temp\"
$database_name = "Test"
$all_server_ids = $h['serverid']


    foreach -parallel ($server_id in $all_server_ids)
    {
        $ErrorActionPreference = 'Continue'
        $severid = $h["serverid"][$all_server_ids.indexof($server_id)]
        $servername =  $h["servername"][$all_server_ids.indexof($server_id)]
        $locationid =  $h["locationid"][$all_server_ids.indexof($server_id)]

        foreach ($file in $file_list)
        {
        
            $release_file = "$folder$file"
            write-output "The file is $release_file "
#                try {
                invoke-sqlcmd -ServerInstance "$servername" -inputfile $folder$file  -Database  "$database_name" -Querytimeout 60 -OutputSqlErrors $true -ConnectionTimeout 10 -ErrorAction Stop -Errorvariable errorvalue 
 #               write-output "-ServerInstance $servername -inputfile $folder$file  -Database  $database_name -Querytimeout 60 -OutputSqlErrors $true -ConnectionTimeout 10 -ErrorAction Stop -Errorvariable errorvalue" 

                # if ($errorvalue){
                #     write-output "Error encountered see $errorvalue"                }
                # }
                   
            #     Catch{
            #         $error_message = $_.Exception.Message
            #         write-output $error_message
            #         write-output $error
            #     }
             }
        }
    }
        
    
RunDeployment

标签: powershell

解决方案


推荐阅读