我有一个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!
答案 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 += "!"
将最后一个(!)添加到字符串