我需要您的一些帮助来改进我的脚本并正确处理异常。 我有一个脚本,使用日期比较删除.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答案 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
这些例子可能有所帮助,除非它比我理解的更复杂。