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