【问题标题】:dynamic modfication of DateTime in the file content动态修改文件内容中的DateTime
【发布时间】:2015-11-02 02:53:11
【问题描述】:

我正在尝试用当前时间修改文件中日志记录的日期和时间,并将其保存在同一个文件中,但不知何故我无法更新它们。 DateTime 是动态变化的,我想按顺序更改每条记录的 DateTime。

如下所示,日期时间随着秒数和毫秒数的增加而变化 - 有没有办法可以根据当前系统时间递增地修改文件?我已经尝试过以下方式-我知道它不正确,但尝试了它是否有效。任何建议或建议解决此问题,请帮助。

环境:Windows 2008 和 Windows 2003

$PATH = "D:\Log\focusServer\focusServer.txt"
$content = "2015-10-27 15:50:21,900 [ListenerThread0] WARN  focus.Core.Server.States.InvalidIPRangeState - Begin 'InvalidIPRangeState' for application '|did:N/A^ep:10.160.210.222:40534^iprg:N/A|'
2015-10-27 15:50:21,900 [ListenerThread0] INFO  focus.Core.Server.Connection.DcmpConnection - |did:N/A^ep:01.60.210.222:40534^iprg:N/A|: Connection Established
2015-10-27 15:50:49,993 [12 ] INFO  focus.Core.Server.Connection.DcmpConnection - |did:N/A^ep:01.60.213.172:39158^iprg:N/A|: Connection Closed.  Reason: Socket closed by remote party (0-byte packet received)
2015-10-27 15:50:49,994 [ListenerThread0] WARN  focus.Core.Server.States.InvalidIPRangeState - Begin 'InvalidIPRangeState' for application '|did:N/A^ep:01.60.213.172:39158^iprg:N/A|'
2015-10-27 15:50:49,994 [ListenerThread0] INFO  focus.Core.Server.Connection.DcmpConnection - |did:N/A^ep:01.60.213.172:39158^iprg:N/A|: Connection Established"

$toReplace = "2015-10-27"
$updateContent = [DateTime]::Now.Add(0).AddHours(0).AddMinutes(0).addseconds(0).toString()
$convertDate = ([datetime]::ParseExact($updateContent,"dd/MM/yyyy HH:mm:ss",$null))
$convertDate.year.toString() + "-" + $convertDate.month.toString() +"-"+ 
$convertDate.day.toString() + " " + $convertDate.Hour.toString() + ":" +$convertDate.Minute.toString() + ":" + $convertDate.Second.toString()

Add-Content -Value $content -Path $PATH

(Get-Content $PATH) | 
Foreach-Object {$_ -replace $toReplace,$updateContent}  | 
Out-File $PATH

【问题讨论】:

  • 你能展示一下你希望它完成后的样子吗?我可以看到您要求的多种解释。你只是替换日期而不是时间?
  • 您解析的精确格式字符串与您的示例数据不匹配。注意数据中的破折号和格式字符串中的斜杠。
  • 最初,我尝试仅使用日期来执行此操作,但似乎我也需要更改时间。我正在尝试按顺序更改每条记录的日期和时间并保存在同一个文件中,例如:2015-10-27 15:50:21,900 [ListenerThread0] WARN focus..... 2015-10-27 15:50: 22,500 [ListenerThread0] INFO 焦点..... 2015-10-27 15:50:22,900 [ListenerThread0] WARN 焦点..... 2015-10-27 15:50:23,400 [ListenerThread0] INFO 焦点...... .
  • 显示文件的示例之后更改是我的要求。您只是在 cmets 中重复了源代码。我知道如何处理时间。我需要知道究竟你在做什么。

标签: .net windows powershell datetime powershell-2.0


【解决方案1】:

好的,您应该能够根据此更改您需要的内容。我们所做的是编辑文件中的每一行。从每一行解析出数据......然后操纵所述日​​期并将其写回同一个文件。

在我的示例中,我们将日期转移到今天,同时保持原始时间戳的相同时间。

# file formatting. Note the space on the end is on purpose.
$formatting = "yyyy-MM-dd HH:mm:ss,fff "
$currentDate = Get-Date

(Get-Content $PATH) | Foreach-Object {
    # Split to get the date on the first occurrence of [.
    $parsed  = $_.split("[",2)
    # Convert to datetime
    $date = [datetime]::ParseExact($parsed[0], $formatting, $null)
    # Get the new time by adding the current date and the time from the parsed data
    $manipulated = $currentDate.Date + $date.TimeOfDay
    # Convert new time to the old format from file and append remainder of line from file.
    $manipulated.ToString($formatting) + "[" + $parsed[1]
} | Set-Content $PATH

基于 2015 年 11 月 1 日(今天)日期的示例数据输出

2015-11-01 15:50:21,900 [ListenerThread0] WARN  focus.Core.Server.States.InvalidIPRangeState - Begin 'InvalidIPRangeState' for application '|did:N/A^ep:10.160.210.222:40534^iprg:N/A|'
2015-11-01 15:50:21,900 [ListenerThread0] INFO  focus.Core.Server.Connection.DcmpConnection - |did:N/A^ep:01.60.210.222:40534^iprg:N/A|: Connection Established
2015-11-01 15:50:49,993 [12 ] INFO  focus.Core.Server.Connection.DcmpConnection - |did:N/A^ep:01.60.213.172:39158^iprg:N/A|: Connection Closed.  Reason: Socket closed by remote party (0-byte packet received)
2015-11-01 15:50:49,994 [ListenerThread0] WARN  focus.Core.Server.States.InvalidIPRangeState - Begin 'InvalidIPRangeState' for application '|did:N/A^ep:01.60.213.172:39158^iprg:N/A|'
2015-11-01 15:50:49,994 [ListenerThread0] INFO  focus.Core.Server.Connection.DcmpConnection - |did:N/A^ep:01.60.213.172:39158^iprg:N/A|: Connection Established

我看到您使用的是正则表达式。您可能在替换字符串中遇到了控制字符问题。我的方法不太容易出错,并且为日期操作开辟了更简单的方法。

【讨论】:

  • 我很抱歉,非常感谢。样本数据正是我正在寻找的,但更多的是动态的。该脚本运行良好,但是当我第二次运行该脚本时出现异常。我猜是因为当前日期的数据已经存在,当我删除数据并运行它时 - 我工作得很好。有没有办法,我可以在每次运行代码时动态更改 DateTime。
  • 我已经想通了 - 添加清除内容作为第一步 - 所以在每次运行之前 - 它会清除内容并插入所述内容并使用当前日期进行修改。请让我知道这是否是一个好方法。
  • 今天再次尝试代码时,它只更改日期而不更改时间。就像小时、分钟和秒一样,它们不会改变——它们保持不变,我们在变量中声明它们。
  • @user1911509 你说你想增加时间。所以我们使用当前日期和文件时间来制作我们的新日期。如果这是错误的,您将需要更改它。我不得不猜测,因为我已经问过你好几次新的时间会看起来是什么样的,而你没有显示出你的预期输出。
猜你喜欢
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 2013-07-03
相关资源
最近更新 更多