Функция PowerShell ISE, выводящая двойные символы перед ожидаемым выводом - PullRequest
0 голосов
/ 26 июня 2019

У меня есть функция ISE powershell, которая возвращает любые символы / строки, которые я вставил в нее ранее, а также ожидаемый вывод строки.

РЕДАКТИРОВАТЬ: Даже если этот конкретный пример может быть решен с помощью регулярного выражения, которое не является точкой выборки данных в цикле for, поскольку они сортируются и помещаются в строку, а ошибка созданных дополнительных символов делает невозможным правильно отформатировать вывод. Приведенный ниже пример кода является упрощенной версией, которая отображает проблему, но в конечном итоге она создаст большую дисперсию символов / строк, добавляемых к переменным, в зависимости от различных ситуаций, которые требуют чистого запуска функции без обходных путей.

Я пытался изменить код, но по какой-то причине он всегда возвращает один и тот же тип ошибки.

Function Get-structure{
    [cmdletbinding()]
    Param (
        [string]$inut
    )
    $output=""
    $DelimListItem=$inut.Split("`r`n")
    for($i=1;$i -lt $DelimListItem.count;$i++){
        $output=$output+$DelimListItem[$i]+"!"
    }
    return $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!

Ожидаемый результат:

Server~00:14~99.54~0~0~0!Server~00:29~99.48~0~0~1!

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Это проще сделать с помощью оператора -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!
0 голосов
/ 26 июня 2019

Вы можете использовать параметр -join, чтобы объединить различные строки и разделить их определенным символом или строкой.

Function Get-structure{
    [cmdletbinding()]
    Param (
        [string]$inut
    )
    $output=""
    $DelimListItem=$inut.Split("`r`n")
    $output = $DelimListItem -join "!"
    $output += "!"
    return $output
}

$output += "!" для добавления последнего (!) К строке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...