向用戶和文件輸出內容的最簡單方法顯然是Tee-Object
。但是,這將始終以雙向方式創建輸出,所以它不是您想要的方式真正可配置的。
我會爭辯說,最好的方法是用一個實際的日誌函數替換你的$out
變量,該函數從管道讀取輸入。
function Write-Log {
[Cmdletbinding()]
Param(
[Parameter(
Mandatory=$true,
Position=0,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true
)]
[string]$Message
)
...
}
可以通過如果日誌文件是在(腳本 - )全局變量定義檢查控制例如輸出:
if ($script:Logfile) {
$Message | Add-Content $script:Logfile
} else {
Write-Host $Message
}
或使每個輸出方法依賴於一個不同的變量:
if ($script:Logfile) {
$Message | Add-Content $script:Logfile
}
if ($script:WriteToConsole) {
Write-Host $Message
}
您還可以在該功能上使用其他參數:
function Write-Log {
[Cmdletbinding()]
Param(
[Parameter(...)]
[string]$Message,
[Parameter(Mandatory=$false)]
[string]Logfile = './default.log',
[Parameter(Mandatory=$false)]
[switch]$Console
)
...
}
或上述的任意組合。
對於日誌記錄我可能更喜歡全局變量,但。您可以在你的腳本的頂部定義在一個地方所有的日誌記錄設置這樣的話(甚至使值取決於腳本參數),只需使用
... | Write-Log
胡亂徘徊無論你想要的東西記錄在你的代碼。另外,無論何時需要改變日誌記錄的工作方式,只需修改Write-Log
函數即可,而無需觸及代碼的其餘部分。
'$ OUT =「寫Host'' - >'$ OUT = {出主機}','$ OUT = '出文件-FilePath C:\測試\ log.txt的-append' ' - >'$ out = {Out-File -FilePath C:\ test \ log.txt -Append}','| $ out' - >'|調用命令$ out'。 – PetSerAl
我不明白你在這裏建議什麼。當我將$ out設置爲(例如): '$ Out ='&| write-host'' 我收到以下錯誤: **調用表達式:輸入對象不能綁定到該命令的任何參數,因爲該命令不接受流水線輸入或輸入及其屬性不匹配任何採用流水線輸入的參數。** – StackExchangeGuy
在我的評論中,我沒有對「Invoke-Expression」進行任何說明。我使用'Invoke-Command'而不是'Invoke-Expression'。 – PetSerAl