在文本文件中转换纪元时间

Convert epoch times in text file

我正在尝试为文本文件中的几个时间戳转换纪元时间,我有下面的代码。我知道替换行是错误的,但我不知道如何使用 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($_)'

Get-Content returns 一个字符串数组,一个字符串对应文件中的每一行。

所以你可以

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($_)'}

正如您自己所说,-replace 行仍然不起作用。

对于 "normal" 正则表达式替换,您拥有的代码可以使用。 -replace 运算符可用于字符串数组(即 Get-Content returns)。

但是,由于您想在替换中使用函数,因此您不能使用该运算符,无论您是将它应用于数组还是循环应用于每个数组元素。相反,您需要将正则表达式定义为 [regex] 对象,并使用其 Replace() 方法对数组元素调用回调 function/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)
}