2016-04-08 14 views
0

ändert Ich habe eine Funktion (mehrere tatsächlich), die Ausgabe schreiben (mit Write-Output). Heute hängen die Funktionen alle davon ab, dass ein $ logpath definiert ist und sie in eine Textdatei ausgeben. In den wenigsten Zeilen, würde ich gerne die Option zur Ausgabe auf dem Bildschirm konfigurieren, wenn der Benutzer möchte (oder wenn $ logpath nicht angegeben ist).Wie man den Ausgangstyp basierend auf dem Parameter

Der folgende Code funktioniert nicht, ist aber ein Beispiel dafür, was ich vorhabe. Was ist der beste Weg, um mein Ziel zu erreichen?

Function Do-Stuff { 
    Param (
     [string]$OutputType 
    ) 

    If ($OutputType -eq 'Host') { 
     $out = 'Write-Host' 
    } 
    Else { 
     $out = 'Out-File -FilePath C:\test\log.txt -Append' 
    } 

    Write-Output ("You are inside the Do-Stuff function.") | $out 
} 

Danke.

+1

'$ out =‚Write-Host'' -> '$ out = {Out-Host}', '$ out = 'Out-File -FilePath C: \ test \ log.txt -Append' '->' $ out = {Ausgabedatei-Dateipfad C: \ test \ log.txt -Append} ',' | $ out' -> '| Invoke-Befehl $ out'. – PetSerAl

+0

Ich verstehe nicht, was Sie hier vorschlagen. Wenn ich $ zum Beispiel als: '$ Out = '& | write-host'' Ich bekomme folgenden Fehler: ** Invoke-Expression: Das Eingabeobjekt kann nicht an irgendwelche Parameter für den Befehl gebunden werden, entweder weil der Befehl keine Pipeline-Eingabe benötigt oder die Eingabe und ihre Eigenschaften nicht Entsprechen Sie einem der Parameter, die Pipeline-Eingabe verwenden. ** – StackExchangeGuy

+0

Ich sage nichts über 'Invoke-Expression' in meinem Kommentar. Ich benutze 'Invoke-Command' und nicht' Invoke-Expression'. – PetSerAl

Antwort

0
Function Do-Stuff { 
    Param (
     [switch]$WriteHost 
    ) 

    $message = Write-Output ("The function is doing stuff.") 
    If ($WriteHost -or ($logPath -eq $null)) {Write-Host $message} Else {$message | Out-File -FilePath $logPath -Append} 
} 
1

Die einfachste Möglichkeit, etwas an den Benutzer und an eine Datei auszugeben, ist offensichtlich Tee-Object. Dies führt jedoch immer zu einer Ausgabe in beide Richtungen, so dass es nicht wirklich konfigurierbar ist.

Ich würde argumentieren, dass der beste Weg, dies zu tun ist, Ihre $out Variable durch eine tatsächliche Logging-Funktion ersetzen, die Eingabe aus der Pipeline liest.

function Write-Log { 
    [Cmdletbinding()] 
    Param(
    [Parameter(
     Mandatory=$true, 
     Position=0, 
     ValueFromPipeline=$true, 
     ValueFromPipelineByPropertyName=$true 
    )] 
    [string]$Message 
) 
    ... 
} 

Sie können die Ausgabe zum Beispiel steuern, indem geprüft wird, ob ein Logfile in einem (Skript-) globale Variable definiert ist:

if ($script:Logfile) { 
    $Message | Add-Content $script:Logfile 
} else { 
    Write-Host $Message 
} 

oder jedes Ausgangsverfahren machen, hängt von einer anderen Variable:

if ($script:Logfile) { 
    $Message | Add-Content $script:Logfile 
} 
if ($script:WriteToConsole) { 
    Write-Host $Message 
} 

Sie können auch zusätzliche Parameter auf die Funktion verwenden:

function Write-Log { 
    [Cmdletbinding()] 
    Param(
    [Parameter(...)] 
    [string]$Message, 
    [Parameter(Mandatory=$false)] 
    [string]Logfile = './default.log', 
    [Parameter(Mandatory=$false)] 
    [switch]$Console 
) 
    ... 
} 

oder eine beliebige Kombination der obigen.

Für die Protokollierung würde ich wahrscheinlich globale Variablen bevorzugen. So können Sie alle Ihre Logging-Einstellungen an einem Ort am Anfang des Skripts definieren können (auch die Werte hängen lassen auf Skript-Parameter) und einfach

... | Write-Log 

wahllos verwenden, wo immer Sie etwas in Ihrem Code protokolliert werden soll.

Wenn Sie Änderungen an der Protokollierung vornehmen müssen, müssen Sie nur die Funktion Write-Log ändern, ohne den Rest des Codes zu berühren.

+0

Toller Vorschlag und ich denke, ich werde es in Zukunft verwenden.In diesem Fall habe ich es am Ende etwas anders gehandhabt.Ich poste, was ich am Ende benutzt habe, separat . – StackExchangeGuy

Verwandte Themen