删除powershell中的回车

时间:2014-04-08 21:24:39

标签: file powershell return

我在文本文件中删除回车时遇到麻烦。我想为“消息”删除回车。我需要将“消息”内容放在一行上。

我的输入如下:

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

非常感谢!

4 个答案:

答案 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)

阿尔格,我超时了,杀了我的回答。在这里,这对我有用。我将示例文本保存到文件C:\ Temp \ Test.txt中。然后我针对它运行了这个脚本:

$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个属性的对象:

  • TimeCreated
  • LevelDisplayName
  • 编号
  • 消息

其中$ 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并对其进行屏幕抓取。