我在文本文件中删除回车时遇到麻烦。我想为“消息”删除回车。我需要将“消息”内容放在一行上。
我的输入如下:
TimeCreated : 08/04/2014 22:31:15
LevelDisplayName : Information
Id : 50065
Message : DHCP a trouvé dans le cache une corespondance pour l’identificateur
(Service Set Identifier) Livebox-816F (valeur hexadécimale de
l’identificateur SSID : C496674) pour la carte réseau dont l’adresse
réseau est 0x0C
我提出了这行代码,但它不起作用:
$MyObject = Get-WinEvent -LogName 'Microsoft-Windows-Dhcp-Client/Admin' | Where-Object {$_.TimeCreated -ge $lastsevendays} | Select 'TimeCreated', 'LevelDisplayName', 'ID', @{n='Message';e={$_.Message -replace '`r', " "}}, $Size
$MyObject > $SourceFile
非常感谢!
答案 0 :(得分:1)
试试这个(折叠在管道上以便于阅读):
$MyObject = Get-WinEvent -LogName 'Microsoft-Windows-Dhcp-Client/Admin' |
Where-Object {$_.TimeCreated -ge $lastsevendays} |
Select 'TimeCreated', 'LevelDisplayName', 'ID', @{n='Message';e={$_.Message -replace '\r', " "}}
$MyObject > $SourceFile
Powershell解析器中的转义字符是反引号,但这些规则不适用于-Replace的正则表达式参数。你必须使用正则表达式解析规则,回车是' \ r'
注意:如果您想将它们全部作为一行,那么您还必须更换新行,因此您的替换将是' \ r \ n',''&# 39;
答案 1 :(得分:0)
$Logs = GC C:\Temp\test.txt
$Event = New-Object PSObject
for($i=0;$i -lt $logs.count;$i++){
If($Logs[$i] -match "^\S"){
$Current = $logs[$i].split(":")
Add-Member -InputObject $Event -MemberType NoteProperty -Name $Current[0].TrimEnd(" ") -Value $Current[1].TrimStart(" ")
$last = $current[0].TrimEnd(" ")}
else
{$Event.$last = $event.$last+$logs[$i].TrimStart(" ")}
}
这给我留下了$ Event,它是一个有4个属性的对象:
其中$ Event.Message是您在请求中所需的单个字符串。
编辑:看到您正在输出事件,看起来您因宽度限制而遇到包装问题。而不是$MyObject > $SourceFile
执行此操作:
$MyObject|fl|Out-File test1.txt -Width $($($MyEvent.Message.Length)+20)
这会像你所拥有的那样输出它,除了它自己的每一行都有自己的行,并且它将宽度格式化为Message属性的长度+ 20个字符以允许Message :
之前的它
答案 2 :(得分:0)
更新
目前尚不清楚OP是否只想删除CR或CRLF。对于"消息内容只在一行",您需要删除CR和LF。
@latkin提出了一个很好的观点,指出OP不仅可能关注属性值,还关注格式化的PowerShell输出。
从实际属性值中删除CR和LF:
$MyObject = Get-WinEvent -LogName 'Microsoft-Windows-Dhcp-Client/Admin' | where TimeCreated -GE $lastsevendays | Select TimeCreated, LevelDisplayName, Id, Message | Remove-NewLines | fl
$MyObject > $sourceFile
更新2:
但是,fl(Format-List)将根据您的控制台宽度包装输出。为了防止这种情况,使用最大宽度管道到Out-String(如果你的意图,那么只删除CR):
$MyObject = Get-WinEvent -LogName 'Microsoft-Windows-Dhcp-Client/Admin' | where TimeCreated -GE $lastsevendays | Select TimeCreated, LevelDisplayName, Id, Message | Remove-NewLines | fl | Out-String -Width 2147483647 | Remove-NewLines -CR
$MyObject > $sourceFile
使用此通用过滤器:
filter Remove-NewLines([string[]]$Name = '*', [switch]$CR, [switch]$LF)
{
$crlf = @{ CR = "`r"; LF = "`n" }
$newLine = $crlf.Keys | where { $PSBoundParameters.ContainsKey($_) } | foreach { $crlf[$_] }
if (-not $newLine)
{
$newLine = "`r", "`n"
}
$newLine = $newLine -join '|'
if ($_ -is [string] -or $_ -is [ValueType])
{
return $_ -replace $newLine
}
$object = $_ | select *
$object.psobject.Properties |
where IsSettable |
where {
$propertyName = $_.Name
$Name | where { $propertyName -like $_ } | select -First 1
} |
foreach { try { $_.Value = $_.Value -replace $newLine } catch { } }
$object
}
示例1:
PS> Get-WinEvent -LogName 'Microsoft-Windows-Dhcp-Client/Admin' | Remove-NewLines
Removes CRs and LFs from all properties.
示例2:
PS> Get-WinEvent -LogName 'Microsoft-Windows-Dhcp-Client/Admin' | Remove-NewLines M* -CR
Removes CRs from the Message property.
答案 3 :(得分:0)
可能是一个愚蠢的熟练工回答,但我有一个类似的问题,这样的工作:
$newdelimiter=" "
$f=get-command attach.txt -raw
$f -replace "\r\n",$newdelimiter
可能已经错过了这一点,如果我这样做了道歉。对我来说,它可以吸收大量的HTML并对其进行屏幕抓取。