繁体   English   中英

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

[英]Powershell ISE function outputting double characters before the expected output

我有一个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!

您可以使用-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是regex替换运算符。 它的第一个输入(第一对引号之间的数据)是一个正则表达式模式。 第二个输入(第二组引号之间的数据)是替换字符串,如果只想删除匹配的字符串,则可以省略。
  • (\\r?\\n)|$是正则表达式模式,它将替换CRLF或LF或字符串的结尾。 在我们的情况下,替换为!
    • \\r? 匹配零或一个回车符。 根据$testdata的创建方式,可能有也可能没有CR字符。
    • \\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()替换为-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!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM