首页 > 解决方案 > 如何检查 foreach 循环中的错误代码?

问题描述

我需要为数据库逻辑转储制作一个简单的脚本。使用脚本的目的有两个。

  1. 如果我使用参数(数据库名称)运行它,它将创建这些数据库的逻辑转储。
  2. 如果我在没有参数的情况下运行,它将启动数据库列表(硬编码)的命令。

我想检查循环pg_dump内每个命令 start ( )的错误代码foreach,记录并继续。最好的方法是什么?

到目前为止,我发现我可以使用tryand catch

旁注:在我的代码try..catch中,出于测试目的,我只尝试了一次。

$path = '"C:\Program Files\PostgreSQL\version\bin\pg_dump.exe"'
$backup_path = 'D:\Backups\test\'
$limit = (Get-Date).AddDays(-2)
$logdate = (Get-Date).ToString("yyyy-MM-dd")
$pg_suffix = "pg_dump"
#$LogFile = $backup_path\$pg_suffix_$(Get-Date -f yyyy-MM-dd) + '.log'
$pg_dump_error = "pg_dump has failed"

$p = $args
[array]$DB_Array = @('postgres', 'db02', 'db03')

if ($p -ne $null) {
    try {
        foreach ($DB in $p) { 
            $backup_path_temp = $backup_path + $DB + '_' + $(Get-Date -f yyyy-MM-dd) + '.backup'
            cmd /c "$path -w -h localhost -U postgres -Z3 -Fd -j 12 -f $backup_path_temp $DB" 
        }
    } catch { 
        #"Error! $pg_dump_error" | Tee-Object -FilePath $LogFile -Append | Write-Error }
        Write "Error: $file.name: $_" >>D:\\Backups\logfile.txt
    }
    continue;
} else {
    foreach ($DB in $DB_Array) {
        $backup_path_temp = $backup_path + $DB + '_' + $(Get-Date -f yyyy-MM-dd) + '.backup'
        cmd /c "$path -w -h localhost -U postgres -Z3 -Fd -j 12 -f $backup_path_temp $DB"
    }
}
# Delete files older than the $limit.
Get-ChildItem -Path $backup_path -Force |
    Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } |
    Remove-Item -Force -Recurse

标签: powershellforeach

解决方案


使用$LastExitcode自动变量在 PowerShell 中获取可执行文件的退出代码。


推荐阅读