Powershell ISE函数在预期输出之前输出双字符

时间:2019-06-26 11:11:27

标签: powershell

我有一个Powershell ISE函数,该函数会返回之前放入的所有字符/字符串以及字符串的预期输出。

编辑:即使可以使用正则表达式解决此特定示例,该正则表达式也不是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 个答案:

答案 0 :(得分:1)

您可以使用-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?匹配零或一个回车符。根据{{​​1}}的创建方式,可能有也可能没有CR字符。
    • $testdata匹配一个换行符
    • \n是正则表达式中的OR机制
    • |是字符串的结尾

.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()运算符。在这种情况下,ISE和控制台将同等对待该操作员。有关使用-split的信息,请参见下文。

-split

答案 1 :(得分:0)

您可以使用-join参数连接不同的字符串,并用特定的字符或字符串分隔它们。

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

$output += "!"将最后一个(!)添加到字符串