我正在嘗試爲最近的條目解析文件。日誌文件中的每個條目均以格式「m/d/yyyy h:mm:ss PM」的格式開頭。將字符串轉換爲powershell 2.0中的datetime
我寫的完成我想要的東西,但遺憾的是這個腳本在PowerShell的5,但沒有運行PowerShell的2
$regex = '\b([1-2][0-9]|[0-9])\/([1-3][0-9]|[0-9])\/(20[0-9][0-9]) ((1[0-2]|0?[1-9]):([0-5][0-9]):([0-5][0-9]) ([AaPp][Mm]))'
$lines = gci C:\temp\Gateway.log | select-string -pattern $regex |select linenumber, matches
[email protected]()
foreach($line in $lines)
{
[datetime]$logdate = ($line.matches).value
$ln = $line.linenumber
if ($logdate -gt '2017-06-29 12:00:00')
{
$log += $ln
}
}
$log
當我嘗試使用PowerShell 2在服務器上運行此腳本的腳本,我得到以下錯誤。
無法將null轉換爲鍵入「System.DateTime」。
我無法將select-string找到的值轉換爲datetime。試圖轉換成字符串的toString並與出串
$dt = $line.matches
$val = $dt|select Value
$val1 = $val|Out-String
$val2 = $val.tostring()
[datetime]$val1
[datetime]$val2
我怎樣才能獲得價值日期時間,所以我可以在它的PowerShell 2做datemath上?
不管PowerShell的版本CultureInfo對象,簡單地鑄造字符串'DateTime'是拙劣的形式,因爲它假定現場實際接受的日期/時間值那個特定的格式。改用'[DateTime] :: ParseExact($ val1,「M/d/yyyy H:mm:ss tt」,[CultureInfo] :: InvariantCulture)'。 (我忘記了是否有更多的PowerShell的方式來做到這一點。) –
還要注意,你的正則表達式過於複雜:如果有人試圖傳遞'14/68/3016 1:62:63 PM '作爲一個有效的日期/時間,只要讓解析器挑出那是無效的。像[[0-9] +'這樣的東西對於簡單的描繪工作來說很好。如果日期/時間恰好具有固定大小或非空格分隔符,則更簡單。 –
@JeroenMostert大寫'H'表示24小時格式,更改爲小寫'h' – LotPings