如何捕获终止错误仍然继续我的PowerShell脚本

时间:2018-02-20 11:35:00

标签: powershell parsing datetime exception

我需要您的一些帮助来改进我的脚本并正确处理异常。 我有一个脚本,使用日期比较删除.log文件中的行,以定义它是否足够老,如果为true,则删除行。 以下是我需要帮助的脚本部分:

Foreach ($Fichier in $Fichiers)
{
    try
    {
        (Get-Content $Fichier) |
            Where-Object {$_} |
            Where-Object { ([datetime]::ParseExact(([string]$_).Substring(0,19), $Format, $Culture) -ge (Get-Date).AddDays(-$Jours)) } |
            Set-Content $Fichier
        LogMessage -Message "Fichier $Fichier purgé des toutes les lignes datant de plus de $Jours jours"
    }
    catch
    {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        LogMessage -Message "$FailedItem - $ErrorMessage"
    }
}

问题是我的.log有像这样的行

[ 30-10-2017 16:38:11.07 | INFO    | XXX.ActiveMQ.ConsumerService.Business.TransactionConsumerTopic | WriteMessageToDlq    ] - Le traitement du message ID:XXXXX-56720-1509361559247-13:1:1:1:1 a rencontré une erreur côté Web Service : TKO / JMS_3.9.47612_2017-10-30 16:38:00.937_TKO / 3.9.47612 / 2017-10-30 16:38:00.937 / 
[1];Erreur non-gérée : Une erreur applicative est survenue.

正如你所看到的,第一行对我的脚本来说是正常的,它会进行子串和日期比较,但有时在文件中,你有第二行不正常,因为它会抛出一个错误,一个终止错误因为我的脚本没有继续

Exception lors de l'appel de « ParseExact » avec « 3 » argument(s) : « La chaîne n'a pas été reconnue en tant que DateTime valide. »

如果日期比较引发错误,我会尝试找到下一行的方法。 在@ Luka-Klarić的评论之后我也尝试过这种方式。

try
    {
        (Get-Content $Fichier) |
            Where-Object {$_} |
            Where-Object { ([datetime]::ParseExact(([string]$_).Substring(0,19), $Format, $Culture) -ge (Get-Date).AddDays(-$Jours)) } -ErrorAction SilentlyContinue |
            Set-Content $Fichier
        LogMessage -Message "Fichier $Fichier purgé des toutes les lignes datant de plus de $Jours jours"
    }
    catch
    {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        LogMessage -Message "$FailedItem - $ErrorMessage"
        Continue
    }

但它也不起作用。对于像我这样的PowerShell noob感谢任何帮助,并询问您是否需要更多信息。

编辑:我已经改变了这个问题的方法,我找到了一种解决方案 - > Purge with PowerShell a big log file by deleting line by line and stopping it when my date comparison is true

2 个答案:

答案 0 :(得分:0)

Normaly try{}catch{}避免程序停止:

$dates = "05/12/2012", "5/12/2012", "05/12/2012"
foreach($date in $dates){try{[datetime]::ParseExact($date, "dd/mm/yyyy", $null )}catch{}}

第二个日期会产生异常,但脚本仍会继续。

答案 1 :(得分:0)

所以,如果我理解正确,你会想知道为什么LogMessage -Message "Fichier $Fichier purgé des toutes les lignes datant de plus de $Jours jours"在遇到终止错误时无法运行?

如果是这种情况,那是因为try{}catch{}立即移动到捕获,然后立即经过该块继续。

如果需要该行即使出现错误也要运行,请将其放在catch块中,或查看将从下一行代码恢复的trap{},不像try{}catch{}

编辑:

try
{
    write-host "line 1" -ForegroundColor Magenta
    throw "custom"
    write-host "line 2" -ForegroundColor Magenta
}
catch
{
    write-host "womp womp" -ForegroundColor Red
}

vs:

trap
{
    write-host "womp womp" -ForegroundColor Red
}    

write-host "line 1" -ForegroundColor Magenta
throw "custom"
write-host "line 2" -ForegroundColor Magenta

这些例子可能有所帮助,除非它比我理解的更复杂。