Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据文本文件PowerShell中的时间戳删除行_Powershell_Batch File - Fatal编程技术网

根据文本文件PowerShell中的时间戳删除行

根据文本文件PowerShell中的时间戳删除行,powershell,batch-file,Powershell,Batch File,这里是PS新手,但我有一个日志文件,其中每个条目都写在单独的一行上,日期格式为:2013-04-29 08:55:09261 我正在尝试使用PowerShell删除所有超过30天的行。我一直在尝试用某种大于代码插入get-date格式的“yyyy-MM-dd-hh”输出,但现在我只是猜测。也一直在尝试批处理文件,但想坚持与PS,如果我可以 任何帮助都将不胜感激。试试以下方法: gc .\logfile.txt | %{if ([datetime][regex]::match($_, '^[0-9

这里是PS新手,但我有一个日志文件,其中每个条目都写在单独的一行上,日期格式为:2013-04-29 08:55:09261

我正在尝试使用PowerShell删除所有超过30天的行。我一直在尝试用某种大于代码插入get-date格式的“yyyy-MM-dd-hh”输出,但现在我只是猜测。也一直在尝试批处理文件,但想坚持与PS,如果我可以

任何帮助都将不胜感激。

试试以下方法:

gc .\logfile.txt | %{if ([datetime][regex]::match($_, '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}').Value -gt (Get-Date).AddDays(-30)) {$_}} > purgedlogfile.txt
组件的分解和说明:

  • \logfile.txt
    是日志文件的路径
  • ^[0-9]{4}-[0-9]{2}-[0-9]{2}[0-9]{2}:[0-9]{2}[0-9]{2}[0-9]{3}
    是一个正则表达式,在每行的开头匹配日志文件的时间戳格式
  • [regex]::match($),^[0-9]{4}-[0-9]{2}-[0-9]{2}[0-9]{2}:[0-9]{2}[0-9]{2}[0-9]{3}')。Value
    返回正则表达式匹配的时间戳
  • 在它前面加上
    [datetime]
    typecast运算符将其转换为datetime对象(以便将其与另一个datetime进行比较)
  • (获取日期)
    返回一个表示当前日期和时间的DateTime对象,
    .AddDays(-30)
    从中减去30天,返回一个表示30天前的DateTime对象
  • 对于日志文件中的每一行,如果表示该行时间戳的日期时间大于表示30天前的日期时间(即,时间戳比30天前更近),则
    if
    块将打印该行,否则它将忽略该行

    • Adi Inbar的答案很好,但如果您希望避免使用正则表达式,这里有另一种方法:

      Get-Content e:\pathto\logfile.txt | Where-Object { ( (Get-Date) - (Get-Date $_.Substring(0,10)) ).Days -le 30} | Add-Content e:\pathto\NewLog.txt 
      

      假设文件包含以下内容:

      2013-04-29 08:55:09,261 line1
      2013-01-29 08:55:09,261 line2
      2013-03-31 08:55:09,261 line3
      
      2013-04-29 08:55:09,261 line1
      2013-01-29 08:55:09,261 line2
      2013-03-31 08:55:09,261 line3
      
      您可以通过以下方式获得所需的输出:

      $culture = [System.Globalization.CultureInfo]::InvariantCulture
      $format = 'yyyy-MM-dd HH:mm:ss,fff'
      
      Get-Content .\test.txt | ? { [datetime]::ParseExact(([string]$_).Substring(0,23), $format, $culture) -ge (Get-Date).AddDays(-30) }
      

      假设文件包含以下内容:

      2013-04-29 08:55:09,261 line1
      2013-01-29 08:55:09,261 line2
      2013-03-31 08:55:09,261 line3
      
      2013-04-29 08:55:09,261 line1
      2013-01-29 08:55:09,261 line2
      2013-03-31 08:55:09,261 line3
      
      对我来说,您的日期采用国际标准日期符号,因此您可以使用:

      $a = [datetime]"2013-04-29 08:55:09"
      
      然后,
      $a
      将是一个日期,因此与文化无关

      您只需编写以下内容即可过滤日期中的所有行(此处为“2013-03-31”)

      我只是在coma上拆分行,取第一部分,在比较之前将其转换为日期

      对于您的30天
      (获取日期).date
      给出不含小时的日期
      (获取日期).date.adddays(-30)
      给出今天之前30天的日期

      get-content C:\temp\date.txt | where { [datetime]($_.split(','))[0] -ge (get-date).date.adddays(-30)}
      

      您可以将结果导入一个新文件
      |设置内容“C:\temp\newdate.txt”

      ,如果您显示实际代码,将非常有帮助。即使它不起作用,它也为人们提供了一个起点。该线程中的大多数代码都运行良好,并给出了期望的结果。唯一的主要区别是运行时间。我选择了这个,因为它运行得快了一点,但是任何遇到这个线程的人都应该有一些选择,所有这些都应该工作得很好。我将尝试对其他贡献发表评论,并给出我的结果。谢谢大家,非常有帮助。这一个删除了超过30天的线路,但由于某种原因,它在13:00之后直到第二天遗漏了任何内容。示例2013-04-29 13:07:42027至2013-04-29 23:57:10425将丢失。可能与24小时时钟格式有关??PS非常初级,所以不确定,但我想分享我的结果。@olirm-yep,我的错误,我的格式是指定12小时格式,而不是24小时固定格式。