Это проще сделать с помощью оператора -replace
.
Function Get-structure{
[cmdletbinding()]
Param (
[string]$inut
)
$inut -replace "(\r?\n)|$","!"
}
Вывод:
$testdata="APP~MEM~Error
Server~00:14~99.54~0~0~0
Server~00:29~99.48~0~0~1"
Get-structure -inut $testdata
APP~MEM~Error!Server~00:14~99.54~0~0~0!Server~00:29~99.48~0~0~1!
Объяснение:
-replace
- оператор замены регулярных выражений.Его первый вход (данные между первой парой кавычек) является шаблоном регулярных выражений.Второй вход (данные между вторым набором кавычек) - это строка замены, которую можно опустить, если вы просто хотите удалить совпадающие строки. (\r?\n)|$
- это шаблон регулярного выражения, который заменит CRLF или LF иликонец строки.В нашем случае замена это !
. \r?
соответствует нулю или одному возврату каретки.В зависимости от того, как создается $testdata
, может быть или не быть символа CR. \n
соответствует одному символу новой строки |
- это механизм ИЛИ в регулярном выражении $
- конец строки
Проблема с методом .Split ("` r`n ") заключается в том, чтоэто игнорирование `n.Он разбивается на `r, а затем` n помещается в строку самостоятельно.Это приводит к следующему, что означает, что эти пустые строки также соединяются с !
.Консоль, похоже, не имеет такого поведения, но ISE имеет.
> $testdata.split("`r`n")
APP~MEM~Error
Server~00:14~99.54~0~0~0
Server~00:29~99.48~0~0~1
Если вы хотите, чтобы ваша структура кода оставалась прежней, вы могли бы заменить .Split()
на оператор -split
.ISE и консоль в этом случае одинаково относятся к этому оператору.Ниже описано использование -split
.
Function Get-structure{
[cmdletbinding()]
Param (
[string]$inut
)
$DelimListItem=$inut -split "\r?\n"
$output = ($DelimListItem | Select-Object -Skip 1) -join "!"
"{0}!" -f $output
}
$testdata="APP~MEM~Error
Server~00:14~99.54~0~0~0
Server~00:29~99.48~0~0~1"
Get-structure -inut $testdata
Server~00:14~99.54~0~0~0!Server~00:29~99.48~0~0~1!