none
Function zum Schreiben eines Log RRS feed

  • Frage

  • Hallo

    ich versuche eine Function zu erstellen, um vom  Script aus ein Log zu erzeugen

    function writelog 
    
    	([string] $info)
    
    	{
    
    		if ($test_path -like "false")
    
    		{
    
    			$logheader > $filepath
    
    		}		
    
    			$info >> $filepath
    
    	}
    
    
    
    
    
    $file = "log_$(get-date -format yyyyMMdd_HHmmss).txt"
    
    #$file = "log.txt"
    
    $filepath = "c:\test\$file"
    
    $test_path = Test-Path $filepath
    
    
    
    
    
    
    
    #Function starten
    
    writelog "1. Eintrag"
    
    writelog "2. Eintrag"
    
    writelog "3. Eintrag"
    
    
    
    $logheader = "
    
    User Erstellung 
    
    ===============
    
    Datum:		$(get-date -format dd.MM.yyyy)
    
    
    
    "
    
    

    Folgende 2 Fragen habe ich dazu:

    - beim IF steht ja $test_path -like "false"). Ich finde das nicht gut. würde es lieber mit Variabeln lösen. z.B $false. Habe aber keine Idee.

    - wenn ich die Function teste und die 3 Test Einträge schreiben möchte. werden alle Einträge auf die gleiche Zeile geschrieben. Was den Effect hat das jeder neue Eintrag denn vorderen überschreibt. Am Schluss steht nur 3. Eintrag im Log. Wo muss ich einen Zeilenumschlag einfügen?

    Kann mir jemand einen Tipp geben?

    Gruss twisters

    P.S. sorry für die "Anfänger" Fragen.... bin noch am lernen


    • Bearbeitet twisters77 Dienstag, 20. September 2011 20:17
    Dienstag, 20. September 2011 18:57

Antworten

  • Moin,

    das Du noch am Anfang bist, helfe ich bewusst mal nur mit Deinen Fragen und auf einzelne Punkte.

    Es würde Dir wenig bringen, Dir ein komplett anderes Script vorzuwerfen, das besser funktionioert, das Du aber nicht verstehst.

    Für Optimierungen gibt es in der Scripter-Laufbahn später immer noch Gelegenheit. :)

    - beim IF steht ja $test_path -like "false"). Ich finde das nicht gut. würde es lieber mit Variabeln lösen. z.B $false. Habe aber keine Idee.

    Das ist nicht nur nicht gut, sondern falsch. In anderen Sprachen funktioniert es eventuell nicht.

    False und True sind in Variablen zu finden: $false und $true.

    Du musst nur ganz einfach mit Ihnen vergleichen:

    if ($test_path -eq $false)

    - wenn ich die Function teste und die 3 Test Einträge schreiben möchte. werden alle Einträge auf die gleiche Zeile geschrieben. Was den Effect hat das jeder neue Eintrag denn vorderen überschreibt. Am Schluss steht nur 3. Eintrag im Log. Wo muss ich einen Zeilenumschlag einfügen?

    -> http://www.colorconsole.de/PS_Windows/de/about_Special_Characters.htm
    (Oder in der PowerShell: get-help about_special_character)

    Um unter Windows einen richtigen Zeilenumbruch zu machen, brauchst Du einen Zeilenwechsel und einen Wagenrücklauf:
    "`n`r"

    Das ` (Graviszeichen, auch als Gravisakzent oder Backtick genannt) findest Du zwischen ß und der Backspace-Taste ganz oben - zusammen mit SHIFT einzugeben.

    Also:

    $logheader > $filepath + "`n`r"

    und

    $info >> $filepath + "`n`r"


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert twisters77 Mittwoch, 21. September 2011 12:24
    Mittwoch, 21. September 2011 05:44
  • ich habs gefunden.

    musste die Variable $fileexist innerhalb und ausserhalb der Funktion mit $global:fileexist bezeichnen. Nun bleibt der Wert $true auch bestehen, wenn die Function abgeschlossen ist.

     

    Gruss

    • Als Antwort markiert twisters77 Mittwoch, 21. September 2011 12:24
    Mittwoch, 21. September 2011 11:08

Alle Antworten

  • Moin,

    das Du noch am Anfang bist, helfe ich bewusst mal nur mit Deinen Fragen und auf einzelne Punkte.

    Es würde Dir wenig bringen, Dir ein komplett anderes Script vorzuwerfen, das besser funktionioert, das Du aber nicht verstehst.

    Für Optimierungen gibt es in der Scripter-Laufbahn später immer noch Gelegenheit. :)

    - beim IF steht ja $test_path -like "false"). Ich finde das nicht gut. würde es lieber mit Variabeln lösen. z.B $false. Habe aber keine Idee.

    Das ist nicht nur nicht gut, sondern falsch. In anderen Sprachen funktioniert es eventuell nicht.

    False und True sind in Variablen zu finden: $false und $true.

    Du musst nur ganz einfach mit Ihnen vergleichen:

    if ($test_path -eq $false)

    - wenn ich die Function teste und die 3 Test Einträge schreiben möchte. werden alle Einträge auf die gleiche Zeile geschrieben. Was den Effect hat das jeder neue Eintrag denn vorderen überschreibt. Am Schluss steht nur 3. Eintrag im Log. Wo muss ich einen Zeilenumschlag einfügen?

    -> http://www.colorconsole.de/PS_Windows/de/about_Special_Characters.htm
    (Oder in der PowerShell: get-help about_special_character)

    Um unter Windows einen richtigen Zeilenumbruch zu machen, brauchst Du einen Zeilenwechsel und einen Wagenrücklauf:
    "`n`r"

    Das ` (Graviszeichen, auch als Gravisakzent oder Backtick genannt) findest Du zwischen ß und der Backspace-Taste ganz oben - zusammen mit SHIFT einzugeben.

    Also:

    $logheader > $filepath + "`n`r"

    und

    $info >> $filepath + "`n`r"


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert twisters77 Mittwoch, 21. September 2011 12:24
    Mittwoch, 21. September 2011 05:44
  • Danke für deine Antwort. Ich habe gestern noch einen Überlegungsfehler gemacht. Wenn die Funktion 3x aufgerunfen wird, wird nicht die Zeile "n. Eintrag" überschrieben, sondern er erstellt bei jedem Durchlauf ein neues File, und überschreibt das vordere.

    Beim Ausführen des Scripts ist das File nie vorhanden. Es muss immer erstellt werden. Daher habe ich das Script abgeändert:

    function writelog 
    	([string] $info)
    	{
    		if ($fileexist -eq $false)
    		{
    			$fileexist = $true
    			"nicht vorhanden" 
    			$logheader > $filepath
    		}
    		
    			"vorhanden"
    			$info >> $filepath 
    		}
    
    
    #$file = "log.txt"
    $file = "log_$(get-date -format yyyyMMdd_HHmm).txt"
    $filepath = "c:\test\$file"
    $fileexist = $false
    #$test_path = Test-Path $filepath
    
    #Function starten
    writelog "1. Eintrag"
    Write-Host $fileexist
    writelog "2. Eintrag"
    Write-Host $fileexist
    #writelog "3. Eintrag"
    
    $logheader = "
    User Erstellung 
    ===============
    Datum:		$(get-date -format dd.MM.yyyy)"
    

    Wenn ich das Script dann starte wird die Variable $fileexist auf $false gesetzt. Nach dem Aufruf der Function, setze ich dann die Variable auf $true und erstelle das File. Soweit so gut. nach dem die Function aber beendet ist, ist die Variable $fileexist wieder auf false. Warum?

    Beim Aufruf der Function wird ja nur die Function abarbeitet und der Rest (wie z.b $fileexist = $false) wir ja nicht mehr verwendet, oder täusche ich mich da?

    Gruss

    Mittwoch, 21. September 2011 07:47
  • ich habs gefunden.

    musste die Variable $fileexist innerhalb und ausserhalb der Funktion mit $global:fileexist bezeichnen. Nun bleibt der Wert $true auch bestehen, wenn die Function abgeschlossen ist.

     

    Gruss

    • Als Antwort markiert twisters77 Mittwoch, 21. September 2011 12:24
    Mittwoch, 21. September 2011 11:08