none
Tab-Delimeter wird nicht in File-Ausgabe übernommen RRS feed

  • Frage

  • Guten Tag,

    ich versuche, ein Logfile für ein PowerShell-Script zu schreiben. Formatiert werden soll die Ausgabe mit Tabulatoren. Das ganze sieht dann grob so aus:

    function writeLog($code, $message) {
    	$text = "$(( get-date ).ToString('yyyyMMdd-HHmmss'))"
    	$text+= "`t$code"
    	$text+= "`t$message"
    	Add-Content $file $text		
    }

    $file ist natürlich global deklariert, aber das ist hier nicht wichtig. Ich habe vielmehr das Problem, dass die `t nicht in das File übernommen werden bzw. nur der Erste. Wenn ich $text auf der Konsole ausgeben, werden die Tabs gesetzt. Im File leider nicht bzw. nur der erste Tab. Was muss ich anders machen? Ich habe natürlich auch versucht, alles in $text hintereinander zu schreiben. Hat auch nicht gefruchtet. Jemand eine Idee, woran das liegen kann?

    Edit: Muss mich korrigieren: Wenn ich den gleichen Code in der Console eingebe, wird auch nur der erste Tab gesetzt.

    Danke im Voraus
    Michael


    • Bearbeitet michael.olb Donnerstag, 28. Juni 2012 08:11 Ergänzung
    Donnerstag, 28. Juni 2012 07:55

Antworten

  • Der Fehler liegt in dem Aufruf deiner Funktion !
    Wenn du die Funktion so aufrufst wie du es machst, dann übergibst du der Variablen $code ein Array von Strings !
    Das heisst ALLES was in den Klammern steht wird in die Variable Code geschüttet. $message bleibt leer!
    In dem Array sind dann natürlich keine Tabs! Standardmässig werden solche Werte in PowerShell mit einem Trennzeichen dargestellt, das ist das normale Space aus der Variablen $OFS!
    Siehe http://rkeithhill.wordpress.com/2009/04/05/effective-powershell-item-15-using-the-output-field-separator-ofs/

    PowerShell Funktionen werden ohne Klammern und ohne Komma aufgerufen!
    Das Komma ist ein Operator ! Der ein Array von Werten herstellt!

    $Array = "hallo","welt" oder $Array = ("hallo","welt")

    Richtig :

    # globale Variablen
    $logpath = "\\mypath\logs\"
    $date = ( get-date ).ToString('yyyyMMdd-HHmmss')
    $file = "$logpath$date-migrateusers.log"
    # Funktion
    function writeLog($code, $message) {
    	$text = "$(( get-date ).ToString('yyyyMMdd-HHmmss'))"
    	$text+= "`t$code"
    	$text+= "`t$message"
    	$text | Out-File -FilePath $file -Append -Force
    	Write-Host $text 
    }
    # Anwendung
    writeLog "INFO" "Migriere $oldlogin zu $newlogin"


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    • Bearbeitet Peter Kriegel Donnerstag, 28. Juni 2012 16:18
    • Als Antwort markiert michael.olb Freitag, 29. Juni 2012 06:31
    Donnerstag, 28. Juni 2012 16:15

Alle Antworten

  • Hallo Michael,

    ich habe das mit Deinem Code getestet und bei mir funktioniert es.
    Hast Du mal z.B. mit eine Hex Editor kontrolliert, ob nicht doch korrekt die Tab's = Ascii 09 ausgegeben werden?

    Editor "zeigen" mit unter eine unterschiedlich Anzahl Leerzeichen zur Formatierung eines Tabs, sodass es manchmal wie nur ein Leerzeichen zwischen den Werten aussieht.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Donnerstag, 28. Juni 2012 08:03
  • Hi, danke für den Hinweis. Hier wird tatsächlich 20 (also Space) im Hex-Editor angezeigt. Beim ersten `t wird korrekterweise 09 angezeigt (nach dem Datum). Leider wird der zweite und dritte Tab übergangen und durch ein Space ersetzt. Kann ich mir echt nicht erklären. Dass es bei dir funktioniert, macht es noch konfuser. Noch eine Idee?

    Donnerstag, 28. Juni 2012 08:20
  • Warum nimmst du nicht Out-File? Da kannst du sogar das Encoding mit angeben!
    $file = 'C:\temp\Tab-Test.txt'
    
    function writeLog($code, $message) {
    	$text = "$(( get-date ).ToString('yyyyMMdd-HHmmss'))"
    	$text+= "`t$code"
    	$text+= "`t$message"
    	$text | Out-File -FilePath $file -Append		
    }
    
    writeLog 'CODE' 'MASSAGE ;-)'


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Donnerstag, 28. Juni 2012 11:05
  • Leider hilft auch die Umstellung auf Out-File nicht. Ich verstehe das nicht. Die Tabs for $code schluckt das Script, aber keine, die danach kommen. Kann das einer verstehen?
    Donnerstag, 28. Juni 2012 13:29
  • Hallo Michael,

    welche Werte enthalten den $code und $message? Tritt es auch auf, denn Du die z.B. als String "aaaa" angibst.

    So habe ich es getestet:

    $code = "hello";
    $message = "world";
    
    $text = "$(( get-date ).ToString('yyyyMMdd-HHmmss'))";
    $text+= "`t$code";
    $text+= "`t$message";
    $text+= "`tund noch einer";
    $text;
    Add-Content "C:\temp\log.txt" $text;


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    • Als Antwort markiert michael.olb Donnerstag, 28. Juni 2012 14:17
    • Tag als Antwort aufgehoben michael.olb Donnerstag, 28. Juni 2012 14:18
    Donnerstag, 28. Juni 2012 13:35
  • $code bekommt entweder "INFO" oder "ERROR" und $message irgendeinen kurzen Satz.

    Das ist wirklich wahnsinnig komisch. Wenn ich es genau so wie du mache, also einfach den Text kopiere und in meine PowerShell-Konsole einfüge, funktioniert es auch. Wenn ich es aber innerhalb meines Scriptes verwende, funktioniert es nicht. Ich stelle hier jetzt nochmal alle wesentlichen Teile des Scriptes rein.

    # globale Variablen
    $logpath = "\\mypath\logs\"
    $date = ( get-date ).ToString('yyyyMMdd-HHmmss')
    $file = "$logpath$date-migrateusers.log"
    # Funktion
    function writeLog($code, $message) {
    	$text = "$(( get-date ).ToString('yyyyMMdd-HHmmss'))"
    	$text+= "`t$code"
    	$text+= "`t$message"
    	$text | Out-File -FilePath $file -Append -Force
    	Write-Host $text 
    }
    # Anwendung
    writeLog("INFO","Migriere $oldlogin zu $newlogin")

    Eine Idee, was hier dazu führt, dass die weiteren Tabs missachtet werden?
    Donnerstag, 28. Juni 2012 14:28
  • Der Fehler liegt in dem Aufruf deiner Funktion !
    Wenn du die Funktion so aufrufst wie du es machst, dann übergibst du der Variablen $code ein Array von Strings !
    Das heisst ALLES was in den Klammern steht wird in die Variable Code geschüttet. $message bleibt leer!
    In dem Array sind dann natürlich keine Tabs! Standardmässig werden solche Werte in PowerShell mit einem Trennzeichen dargestellt, das ist das normale Space aus der Variablen $OFS!
    Siehe http://rkeithhill.wordpress.com/2009/04/05/effective-powershell-item-15-using-the-output-field-separator-ofs/

    PowerShell Funktionen werden ohne Klammern und ohne Komma aufgerufen!
    Das Komma ist ein Operator ! Der ein Array von Werten herstellt!

    $Array = "hallo","welt" oder $Array = ("hallo","welt")

    Richtig :

    # globale Variablen
    $logpath = "\\mypath\logs\"
    $date = ( get-date ).ToString('yyyyMMdd-HHmmss')
    $file = "$logpath$date-migrateusers.log"
    # Funktion
    function writeLog($code, $message) {
    	$text = "$(( get-date ).ToString('yyyyMMdd-HHmmss'))"
    	$text+= "`t$code"
    	$text+= "`t$message"
    	$text | Out-File -FilePath $file -Append -Force
    	Write-Host $text 
    }
    # Anwendung
    writeLog "INFO" "Migriere $oldlogin zu $newlogin"


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    • Bearbeitet Peter Kriegel Donnerstag, 28. Juni 2012 16:18
    • Als Antwort markiert michael.olb Freitag, 29. Juni 2012 06:31
    Donnerstag, 28. Juni 2012 16:15
  • Danke, danke und nochmals danke!

    Ich habe mir fast gedacht, dass es mit der etwas eigenen Behandlung von Variablen- und Rückgabewerten in PowerShell zu tun hat. Manchmal fällt man eben doch zurück in die üblichen Programmiertechniken, die in PowerShell zwar keine Fehler produzieren, aber im Detail anderes Verhalten als erwartet produzieren.

    Danke für eure Hilfe!

    Freitag, 29. Juni 2012 06:31