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.
'$ 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
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
Ich sage nichts über 'Invoke-Expression' in meinem Kommentar. Ich benutze 'Invoke-Command' und nicht' Invoke-Expression'. – PetSerAl