转换文本文件

时间:2015-08-14 00:02:33

标签: powershell time epoch

我试图在文本文件中转换几个时间戳的纪元时间,我有下面的代码。我知道替换行是错误的,但我不知道如何使用foreach-object来完成此任务。

Function Convert-FromUnixdate ($UnixDate) {
   ,[timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').`
   AddmilliSeconds($UnixDate))
}

$convert = Get-Content -Path C:\test\test.txt
$convert -Replace "[0-9]{13}", 'Convert-FromUnixdate($_)'

2 个答案:

答案 0 :(得分:0)

Get-Content返回一个字符串数组,每个字符串对应一个文件。

所以你可以做到

foreach ($line in (Get-Content -Path C:\test\test.txt))
{
    $line -Replace "[0-9]{13}", 'Convert-FromUnixdate($line)'
}

或者使用更简约的变体

Get-Content -Path C:\test\test.txt | % {$_ -Replace "[0-9]{13}", 'Convert-FromUnixdate($_)'}

正如你所陈述的那样,仍然没有 - 替换线。

答案 1 :(得分:0)

对于“正常”正则表达式替换,您拥有的代码将起作用。 -replace运算符可用于字符串数组(Get-Content返回的内容)。

但是,由于您要在替换中使用函数,因此无论是将其应用于数组还是将循环应用于每个数组元素,都无法使用该运算符。相反,您需要将正则表达式定义为[regex]对象,并使用其Replace()方法调用数组元素上的回调函数/ scriptblock。

function Convert-FromUnixDate($UnixDate) {
  [timezone]::CurrentTimeZone.ToLocalTime(([DateTime]'1/1/1970').AddMilliseconds($UnixDate))
}

$re = [regex]'\d{13}'
$callback = { Convert-FromUnixDate($args[0].Value) }

Get-Content -Path 'C:\test\test.txt' | ForEach-Object {
  $re.Replace($_, $callback)
}