2016-04-08 55 views
0

更改輸出類型我有一個函數(實際上有幾個)寫輸出(使用寫輸出)。今天,這些函數都依賴於定義一個$ logpath並將它們輸出到一個文本文件。在儘可能少的行中,我想配置選項以輸出到用戶想要的屏幕(或者未指定$ logpath)。如何根據參數

下面的代碼不起作用,但是我想到的是一個例子。什麼是實現我的目標的最佳方式?

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 
} 

謝謝。

+1

'$ OUT =「寫Host'' - >'$ OUT = {出主機}','$ OUT = '出文件-FilePath C:\測試\ log.txt的-append' ' - >'$ out = {Out-File -FilePath C:\ test \ log.txt -Append}','| $ out' - >'|調用命令$ out'。 – PetSerAl

+0

我不明白你在這裏建議什麼。當我將$ out設置爲(例如): '$ Out ='&| write-host'' 我收到以下錯誤: **調用表達式:輸入對象不能綁定到該命令的任何參數,因爲該命令不接受流水線輸入或輸入及其屬性不匹配任何採用流水線輸入的參數。** – StackExchangeGuy

+0

在我的評論中,我沒有對「Invoke-Expression」進行任何說明。我使用'Invoke-Command'而不是'Invoke-Expression'。 – PetSerAl

回答

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

向用戶和文件輸出內容的最簡單方法顯然是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函數即可,而無需觸及代碼的其餘部分。

+0

好的建議,我想我會在將來使用它,在這種情況下,我最終處理它有點不同,我將發佈我最終使用的。 – StackExchangeGuy