2017-09-14 32 views
1

我想從這個字符串「.TXT」之前提取的最後4位數字:如何提取字符串在PowerShell中的某一部分

09/14/2017 12:00:27 - mtbill_post_201709141058.txt 7577_Delivered: OK

那些代表着該日誌的創建時間和我想要在10:58顯示它。我從一個文件中讀取,該文件有多行與顯示的行相似。

Get-Content file.txt | ForEach-Object { 
$splitUp = $_ -split "_" 
$SC=$splitUp[2] -split "_" 
Write-Host $SC 
$len = $SC.Length 
$folder2 = $SC.Substring($len - 12, 42) 
} 

我試圖通過「_」分離字符串,然後將得到的字符串中計數的字符,並試圖通過「串」命令中分離,但我收到以下錯誤。

異常呼叫 「串」 與 「2」 的參數(一個或多個): 「開始索引不能 小於零參數名:。的startIndex」

在行:6焦炭:5 + $文件夾2 = $ SC.Substring($ LEN - 12,42)

  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~
    • CategoryInfo:NotSpecified:(:) [],MethodInvocationException
    • FullyQualifiedErrorId:ArgumentOutOfRangeException

回答

4

您可以使用正則表達式「lookahead」。

什麼您正在搜索是一組四位數字後面加上 「.TXT」:

$string = "09/14/2017 12:00:27 - mtbill_post_201709141058.txt 7577_Delivered: OK" 
$regex = "\d{4}(?=\.txt)" 
[regex]::matches($string, $regex).value 
+4

'[regex] :: match($ string,$ regex).Value.Insert(2,「:」)'格式化爲10: 58 –

+1

這是更好的答案。 –

+0

謝謝!感謝Mark Wragg,我明白現在發生的事情。 –

2

有可能是一個更優雅的解決方案:

$String = '09/14/2017 12:00:27 - mtbill_post_201709141058.txt 7577_Delivered: OK' 

$String -Match '.*(?=\.txt)' | Out-Null 
$Match = $Matches[0][-4..-1] -Join '' 

$Time = [DateTime]::ParseExact($Match, 'HHmm',[CultureInfo]::InvariantCulture) 
$Time.ToShortTimeString() 
  • 使用正則表達式中的.txt之前把所有的字符串
  • 採用數組索引從第4個字符到最後一個字符並加入t作爲一個單一的繩子一起下襬。
  • 使用ParseExact將該值轉換爲DateTime對象,將其解釋爲24小時時間代碼
  • 輸出該DateTime對象的Short Date值。
+0

感謝一大堆!我只是一個簡單的問題。這可能是愚蠢的,但我是新的,我真的只是想正確理解它發生了什麼。我不明白'。*(?= \。txt)'是什麼。我知道它會在.txt之前得到所有的字符串,但是如何? 再次感謝! –

+1

根據其他答案(對於正則表達式部分更簡單/更好,我建議你upvote/accept)它正在做一個正則表達式「lookahead」,它表示匹配'?='表示的模式之前的模式。見這裏:http://www.regular-expressions.info/lookaround.html –

2

只是SubstringIndexOf做到這一點:

$string="09/14/2017 12:00:27 - mtbill_post_201709141058.txt 7577_Delivered: OK" 
$string.Substring($string.IndexOf('.txt')-4, 4)