none
Anführungszeichen durch Script löschen RRS feed

  • Frage

  • Hallo,

    Ich habe folgendes Problem. Ich erzeuge mit aus dem Eventlog einen Stream den ich in einer CSV Datei speichern will. Leider wird jeder Eintrag mit "" markiert, was beim anschließenden Parsen und verwerten eher hinderlich ist.

    Nun habe ich mir das SED Pendant in der Powershell gesucht um die dinger Rauszusubstituieren -->

    eventlogstream | %{$_ -replace "\"",""} | Export-Csv

    Mit einfachem Maskieren durch \ komme ich jedoch nicht weit, da die Brackets als offen angesehen werden.  Bei Zwei \ tut sich ebenfalls nichts, und bei 2 " hab ich fast nichts mehr in der Datei.

    Was kann ich nun tun um Die "" aus einer csv datei zu löschen á la "finde und vernichte" ?

    Viele Grüße

    Montag, 20. Juni 2011 14:52

Antworten

  • Hallo verwende bitte fuer die Maskierung einfache Anführungszeichen (deutsche Tastatur: beim #-Zeichen) Dein Replace Staement sieht dann so aus:

     

    -replace '"',''

     

    ein kleines Beispiel (ich hoffe ich habe Deine Anfrage richtig versntaden)

     

    $test='"test"'

    Liefert "test"

     

    daraus soll der String test ohne anfuehrungszeichen extrahiert werden

    $test = $test -replace '"',''

     

    $test enthaelt anschliessend den string test ohne Anfuehrungszeichen.

     

     

     

     

     


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    • Als Antwort markiert moRytox Dienstag, 21. Juni 2011 08:32
    Montag, 20. Juni 2011 16:01
  • Moin,

    ergänzend zu Peddy1st:

    In der PowerShell ist das "Escape"-Zeichen nicht der Backslash, sondern der
    sog. Backtick (auch Backquote genannt). Das ist der hier ` also der "accent
    grave", auf deutschen Tastaturen neben dem ß zusammen mit SHIFT.

    Dein Beispiel wäre also:
    eventlogstream | %{$_ -replace "`"",""} | Export-Csv

    Die einfachen oder doppelt normalen Anführungszeichen, die Peddy erwähnt,
    haben noch eine andere Bedeutung, die doppelt lösen Variablen auf, die
    einfachen nicht:

    PS C:\> $test = "TEST"
    PS C:\> "$test"
    TEST
    PS C:\> '$test'
    $test


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert moRytox Dienstag, 21. Juni 2011 08:32
    Dienstag, 21. Juni 2011 05:39
  • Moin,

    Ich bin ein OP ? Was bedeutet das genau ?

    http://de.wikipedia.org/wiki/OP
    -> "original poster im Usenet, derjenige, der den ersten (ursprünglichen)
    Beitrag in einem Thread (Internet) erstellt hat"

    Manchmal wird auch "TO" (Thread Owner) oder "TS" (Thread Starter)
    verwendet.

    Im endeffekt hat bei mir der Backtick zur lösung geführt. Die einfachen ' ' führen zu einem ParserError da sie nicht Maskieren ( vllt auch eine Falsche anwendung von mir )

    Vermutlich, denn so sollte es auch gehen:
    eventlogstream | %{$_ -replace '"',""} | Export-Csv

     Jedoch hab ich immernoch ein Problem festgestellt. Wenn ich den Stream aus dem Eventlog durch die Pipe Leite kommt

    anstelle der Auflistung der Einzelnen Eventlogelemente nur 2 Zellen : Length  und 32 (untereinander) , ind dem ursprünglichen Stram gibt es jedoch kein Length und keine 32 o.O

    Hab ich hier jetzt eine Zählfunktion geschrieben ?

    $path = "\\server123\Daten\ <file://\\server123\Datenbestand\05>IT\Operations\WindowsServerbackup\"
    $server = $args[0]
    $copypath = $path + $server + ".csv" Get-Eventlog -logname Application -instanceid 754 -newest 1 | %{$_ -replace "`"",""} | Export-Csv -delimiter ";" -path $copypath -encoding "unicode" -NoTypeInformation

    Das Problem ist die Replace-Funktion sein, die nach dem Replace ein neues
    Object erzeugt.

    PS C:\> Get-EventLog -LogName Application -Newest 1 | gm

       TypeName: System.Diagnostics.EventLogEntry#Application/Office Software
    Protection Platform Service/1073742827

    ....

    PS C:\> Get-EventLog -LogName Application -Newest 1 | % {$_ -replace "`"",
    "" } | gm

       TypeName: System.String
    ....

    Du findest in Deiner CSV-Datei also nicht mehr den Eventlog-Eintrag,
    sondern einen irgendwie konvertierten String, der 32 Zeichen lang ist.

    Das mit einem Einzeiler zu lösen, wird nicht möglich sein (oder zumindest
    sehr kompliziert).

    Prinzipiell hättest Du folgende Varianten:
     - ein neues Object mit den replaceden Werten aufbauen
     - nachträglich die CSV-Datei als einfachen Text öffnen und dort die
    Anführungszeichen entfernen

    Wahrscheinlich kommen gleich noch fünf andere Vorschläge. :)


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert moRytox Dienstag, 21. Juni 2011 08:32
    Dienstag, 21. Juni 2011 07:41

Alle Antworten

  • Hallo verwende bitte fuer die Maskierung einfache Anführungszeichen (deutsche Tastatur: beim #-Zeichen) Dein Replace Staement sieht dann so aus:

     

    -replace '"',''

     

    ein kleines Beispiel (ich hoffe ich habe Deine Anfrage richtig versntaden)

     

    $test='"test"'

    Liefert "test"

     

    daraus soll der String test ohne anfuehrungszeichen extrahiert werden

    $test = $test -replace '"',''

     

    $test enthaelt anschliessend den string test ohne Anfuehrungszeichen.

     

     

     

     

     


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    • Als Antwort markiert moRytox Dienstag, 21. Juni 2011 08:32
    Montag, 20. Juni 2011 16:01
  • Moin,

    ergänzend zu Peddy1st:

    In der PowerShell ist das "Escape"-Zeichen nicht der Backslash, sondern der
    sog. Backtick (auch Backquote genannt). Das ist der hier ` also der "accent
    grave", auf deutschen Tastaturen neben dem ß zusammen mit SHIFT.

    Dein Beispiel wäre also:
    eventlogstream | %{$_ -replace "`"",""} | Export-Csv

    Die einfachen oder doppelt normalen Anführungszeichen, die Peddy erwähnt,
    haben noch eine andere Bedeutung, die doppelt lösen Variablen auf, die
    einfachen nicht:

    PS C:\> $test = "TEST"
    PS C:\> "$test"
    TEST
    PS C:\> '$test'
    $test


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert moRytox Dienstag, 21. Juni 2011 08:32
    Dienstag, 21. Juni 2011 05:39
  • Hallo Robert,

    von doppelten Anfuehrungszeichen habe ich nicht geredet. Vielmehr von einfachen Anfuehrungszeichen. ich denke aber das das accent grave wie von dir gesagt in diesem Fall die gleichen Bedeutung aht wie die von mir erwaehnten Einfachen Anfuehrungszeichen.

     

    Viele Gruesse

       Thomas

     


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    Dienstag, 21. Juni 2011 07:11
  • Moin,

    von doppelten Anfuehrungszeichen habe ich nicht geredet. Vielmehr von einfachen Anfuehrungszeichen. ich denke aber das das accent grave wie von dir gesagt in diesem Fall die gleichen Bedeutung aht wie die von mir erwaehnten Einfachen Anfuehrungszeichen.

    es hat die gleiche Wirkung, aber nicht die gleiche Bedeutung.

    Man kann das konkrete Proiblem auch mit einfachen Anführungszeichen lösen,
    wie Du es gezeigt hast. Das Schöne an der PowerShell ist ja, dass es meist
    mehr als eine Lösung gibt. :)

    Aber der OP kannte ja die Wirkung des Backslashes und wunderte sich, dass
    der in der PowerShell nicht funktioniert. Daherhabe ich gezeigt, dass der
    Backslash in der PowerShell Backtick heißt und durch das Zeichen "accent
    grave" symbolisiert wird.

    Deine und meine Aussage sind beides Informationen, die man auch an ganz
    vielen anderen Stellen, wenn es nicht um doppelte Anführungszeichen geht,
    nutzen kann und muss.


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Dienstag, 21. Juni 2011 07:17
  • Ich bin ein OP ? Was bedeutet das genau ?

    Im endeffekt hat bei mir der Backtick zur lösung geführt. Die einfachen ' ' führen zu einem ParserError da sie nicht Maskieren ( vllt auch eine Falsche anwendung von mir )

    Aber dank euch beiden für die Hilfe! 

     Jedoch hab ich immernoch ein Problem festgestellt. Wenn ich den Stream aus dem Eventlog durch die Pipe Leite kommt

    anstelle der Auflistung der Einzelnen Eventlogelemente nur 2 Zellen : Length  und 32 (untereinander) , ind dem ursprünglichen Stram gibt es jedoch kein Length und keine 32 o.O

    Hab ich hier jetzt eine Zählfunktion geschrieben ?

    $path = "\\server123\Daten\IT\Operations\WindowsServerbackup\"
    $server = $args[0]
    $copypath = $path + $server + ".csv"
    Get-Eventlog -logname Application -instanceid 754 -newest 1 | %{$_ -replace "`"",""} | Export-Csv -delimiter ";" -path $copypath -encoding "unicode" -NoTypeInformation

    Dienstag, 21. Juni 2011 07:28
  • Moin,

    Ich bin ein OP ? Was bedeutet das genau ?

    http://de.wikipedia.org/wiki/OP
    -> "original poster im Usenet, derjenige, der den ersten (ursprünglichen)
    Beitrag in einem Thread (Internet) erstellt hat"

    Manchmal wird auch "TO" (Thread Owner) oder "TS" (Thread Starter)
    verwendet.

    Im endeffekt hat bei mir der Backtick zur lösung geführt. Die einfachen ' ' führen zu einem ParserError da sie nicht Maskieren ( vllt auch eine Falsche anwendung von mir )

    Vermutlich, denn so sollte es auch gehen:
    eventlogstream | %{$_ -replace '"',""} | Export-Csv

     Jedoch hab ich immernoch ein Problem festgestellt. Wenn ich den Stream aus dem Eventlog durch die Pipe Leite kommt

    anstelle der Auflistung der Einzelnen Eventlogelemente nur 2 Zellen : Length  und 32 (untereinander) , ind dem ursprünglichen Stram gibt es jedoch kein Length und keine 32 o.O

    Hab ich hier jetzt eine Zählfunktion geschrieben ?

    $path = "\\server123\Daten\ <file://\\server123\Datenbestand\05>IT\Operations\WindowsServerbackup\"
    $server = $args[0]
    $copypath = $path + $server + ".csv" Get-Eventlog -logname Application -instanceid 754 -newest 1 | %{$_ -replace "`"",""} | Export-Csv -delimiter ";" -path $copypath -encoding "unicode" -NoTypeInformation

    Das Problem ist die Replace-Funktion sein, die nach dem Replace ein neues
    Object erzeugt.

    PS C:\> Get-EventLog -LogName Application -Newest 1 | gm

       TypeName: System.Diagnostics.EventLogEntry#Application/Office Software
    Protection Platform Service/1073742827

    ....

    PS C:\> Get-EventLog -LogName Application -Newest 1 | % {$_ -replace "`"",
    "" } | gm

       TypeName: System.String
    ....

    Du findest in Deiner CSV-Datei also nicht mehr den Eventlog-Eintrag,
    sondern einen irgendwie konvertierten String, der 32 Zeichen lang ist.

    Das mit einem Einzeiler zu lösen, wird nicht möglich sein (oder zumindest
    sehr kompliziert).

    Prinzipiell hättest Du folgende Varianten:
     - ein neues Object mit den replaceden Werten aufbauen
     - nachträglich die CSV-Datei als einfachen Text öffnen und dort die
    Anführungszeichen entfernen

    Wahrscheinlich kommen gleich noch fünf andere Vorschläge. :)


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert moRytox Dienstag, 21. Juni 2011 08:32
    Dienstag, 21. Juni 2011 07:41
  • dann sollte es ja auch einfach möglich sei nach dem erstellen der csv datei eine neue Zeile ins Script zu laden bei der ich einfach den Inhalt der CSV über Cat ausgebe, bearbeite und wieder in die Datei zurückstreame oder ?

    *Edit*

    $server = $args[0]
    $copypath = $path + $server + ".csv"
    $temp = $path +"temp.csv"
    Get-Eventlog -logname Application -instanceid 754 -newest 1 | Export-Csv -delimiter ";" -path $temp -encoding "unicode" -NoTypeInformation
    cat $temp |  %{$_ -replace "`"",""} > $copypath

    Das Klappt! Danke für die vielen Infos die mir hier weitergeholfen haben!

    Viele Grüße!

    Dienstag, 21. Juni 2011 08:23