2017-07-04 59 views
0

我正在嘗試爲最近的條目解析文件。日誌文件中的每個條目均以格式「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上?

+0

不管PowerShell的版本CultureInfo對象,簡單地鑄造字符串'DateTime'是拙劣的形式,因爲它假定現場實際接受的日期/時間值那個特定的格式。改用'[DateTime] :: ParseExact($ val1,「M/d/yyyy H:mm:ss tt」,[CultureInfo] :: InvariantCulture)'。 (我忘記了是否有更多的PowerShell的方式來做到這一點。) –

+0

還要注意,你的正則表達式過於複雜:如果有人試圖傳遞'14/68/3016 1:62:63 PM '作爲一個有效的日期/時間,只要讓解析器挑出那是無效的。像[[0-9] +'這樣的東西對於簡單的描繪工作來說很好。如果日期/時間恰好具有固定大小或非空格分隔符,則更簡單。 –

+0

@JeroenMostert大寫'H'表示24小時格式,更改爲小寫'h' – LotPings

回答

1

根據我的經驗,如果您當前的區域設置不適用於它,am/pm轉換不起作用(也不適用於[CultureInfo] :: InvariantCulture)。

你需要指定它支持AM/PM

$enUS = 'en-US' -as [Globalization.CultureInfo] 
$val1 = (get-date).ToString("M/d/yyyy H:mm:ss tt", $enUS) 
$val1 
[DateTime]::ParseExact($val1, "M/d/yyyy H:mm:ss tt", $enUS) 
+0

我必須將我的匹配日期作爲數組進行投射,因爲tostring()不會轉換任何東西。 $ enUS ='en-US'-as [Globalization.CultureInfo] $ dt = $ line.matches $ val = @($ dt |%{$ _。Value}) $ val = $ val [0]。 ToString() [DateTime] :: ParseExact($ val,「M/d/yyyy H:mm:ss tt」,$ enUS) –

+0

根據[這些表格](https),注意大寫'H' ://ss64.com/ps/syntax-dateformats.html)你需要小寫'h'作爲12小時am/pm格式。 – LotPings