在PowerShell中使用函数:
function WriteToLog {
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline)]
[AllowEmptyCollection()]
[AllowEmptyString()]
[string[]]$Message
)
BEGIN {}
PROCESS {
if ($Null -ne $Message) {
$dt = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
foreach ($item in $Message) {
if ($item.length -gt 0) {
$it = $item -split '(.{1,70})' | Where-Object {$_}
$dt + ": " + $it[0] | Write-Host
$dt = $dt -replace '(.)',' '
$i = 1
while ($it[$i]) {
$dt + " " + $it[$i] | Write-Host
$i++
}
}
}
}
}
END {}
}
现在用字符串调用它:
"----" | WriteToLog
给出:
2023-05-25 00:28:05: -
-
-
-
-
我以为
2023-05-25 00:28:05: -----
不按字符拆分字符串。对于长度超过70个字符的字符串,它按预期工作:
"--------------------------------------------------------------------------" | WriteToLog
给出:
2023-05-25 00:32:37: ----------------------------------------------------------------------
----
知道为什么会这样吗
1条答案
按热度按时间dba5bblo1#
将正则表达式更改为
'(?<=\G.{70})'
,以便它仅在字符数为70
时进行拆分,同时使用\G
的正向后查找,消除了在令牌不是空字符串(Where-Object { $_ }
)时进行过滤的需要。条件if ($Null -ne $Message)
也是不必要的,因为你已经枚举了集合并检查了if ($item.Length -gt 0)
。