【发布时间】:2018-02-21 23:28:37
【问题描述】:
我需要您的帮助来改进我的脚本并正确处理异常。 我有一个脚本来删除 .log 文件中的行,使用日期比较来定义它是否足够旧,如果为真,则删除行。 这是我需要帮助的脚本部分:
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 菜鸟,我们非常感谢您提供任何帮助,并询问您是否需要更多信息。
编辑:我已经改变了解决该问题的方法,并以这种方式找到了解决方案 -> Purge with PowerShell a big log file by deleting line by line and stopping it when my date comparison is true
【问题讨论】:
标签: powershell parsing datetime exception