Насколько мне известно, вы не можете использовать для этого статические методы String, такие как Split ().Я пытался найти регулярное выражение, которое бы обрабатывало все это, но не смогло найти ничего, что могло бы его правильно разбить.
Итак, вам нужно идти строка за строкой,тестирование, чтобы увидеть, является ли эта строка датой, затем объединить строки между ними, как показано ниже:
$fileContent = Get-Content "inputFile.txt"
$messages = @()
$currentMessage = [string]::Empty
foreach($line in $fileContent)
{
if ([Regex]::IsMatch($line, "\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}:\d{2} (A|P)M"))
{
# The current line is a date, the current message is complete
# Add the current message to the output, and clear out the old message
# from your temporary storage variable $currentMessage
if (-not [string]::IsNullOrEmpty($currentMessage))
{
$messages += $currentMessage
$currentMessage = [string]::Empty
}
}
else
{
# Add this line to the message you're building.
# Include a new line character, as it was stripped out with Get-Content
$currentMessage += "$line`n"
}
}
# Add the last message to the output
$messages += $currentMessage
# Do something with the message
Write-Output $messages
Поскольку ключом ко всему этому является признание того, что данная строка является датой и, следовательно, началомсообщения, давайте посмотрим немного подробнее на регулярное выражение.«\ d» будет соответствовать любому десятичному символу 0–9, а непосредственно следующие фигурные скобки указывают количество десятичных символов, которые должны соответствовать.Таким образом, \ d {1,2} означает «искать один или два десятичных знака» или, в данном случае, месяц года.Затем мы ищем «/», еще 1 или 2 десятичных знака - «\ d {1,2}», еще один «/», а затем ровно 4 десятичных знака - «\ d {4}».Время больше того же самого, с ":" между десятичными знаками вместо "/".В конце будет либо «AM», либо «PM», поэтому мы ищем либо «A», либо «P», за которым следует «M», что в качестве регулярного выражения равно «(A | P) M».
Объедините все это, и вы получите "\ d {1,2} / \ d {1,2} / \ d {4} \ d {1,2}: \ d {2}: \ d {2} (A | P) M ", чтобы определить, есть ли у вас дата в этой строке.Я полагаю, что было бы также возможно использовать [DateTime] :: Parse (), чтобы определить, является ли строка датой, но тогда вы не получите удовольствия от Regex и нуждаетесь в try-catch.Для получения дополнительной информации о Regex в Powershell (которые являются просто .NET Regex) см. .NET Regex Quick Reference