2013-06-19 122 views
2

我有一個腳本,其中包括一個記錄功能。 該函數將日誌寫入$ msg變量,然後將消息寫入屏幕。 我可以將此輸出重定向到.txt文件進行日誌記錄。從調用命令Powershell日誌記錄

我需要使用invoke-command 將腳本運行到多個服務器,並將日誌輸出寫入運行腳本的計算機上的txt文件。

我想弄清楚如何在PSSession的寫入日誌函數中輸出$ msg並返回它,以便我可以爲所有服務器創建一個主日誌文件。我應該創建並填充自定義對象嗎?不知道如何做到這一點,並從遠程會話中得到結果。

這可以完成嗎?

這裏是我使用的代碼,以及日誌文件的輸出應該看起來像的一個例子:

$servers = 'Server1','Server2' 
$logfile = 'c:\scripts\logs\Reg-DLL-log.txt' 

foreach($server in $servers){ 
    invoke-command -cn $server -sb{ 
     Param($server) 

     Function write-log{ 
      [cmdletbinding()] 
      Param(
       [Parameter(ValueFromPipeline=$true,Mandatory=$true)] [ValidateNotNullOrEmpty()] 
       [string] $Message, 
       [Parameter()] [ValidateSet(「Error」, 「Warn」, 「Info」)] 
       [string] $Level = 「Info」, 
       [Parameter()] [ValidateRange(1,30)] 
       [Int16] $Indent = 0 
      ) 
      $msg = "{0} {1}{2}:{3}" -f (Get-Date -Format "yyyy-MM-dd HH:mm:ss"), $Level.ToUpper(), (" " * $Indent), $Message 
       #This is output to screen 
       switch ($Level) { 
        'Error' { Write-Host ('{0}{1}' -f (" " * $Indent), $Message) -ForegroundColor 'Red'} 
        'Warn' { Write-Host ('{0}{1}' -f (" " * $Indent), $Message) -ForegroundColor 'Yellow'} 
        'Info' { Write-Host ('{0}{1}' -f (" " * $Indent), $Message) -ForegroundColor 'white'} 
     }} 

     write-log -message 'Begin DLL registration for $server' -level Info 
     $RegFile = "cimwin32.dll" 
     regsvr32 $RegFile /s 
     write-log -message 'registered $RegFile' -level Info 
     write-log -message 'End DLL registration for $server' -level Info 

    } -ArgumentList $server 
} 

日誌輸出到REG-DLL-log.txt的應該是這樣的:

2013-06-19 11:25:12 INFO:Begin DLL registration for Server1 
2013-06-19 11:25:12 INFO:registered cimwin32.dll 
2013-06-19 11:25:12 INFO:End DLL registration for Server1 
2013-06-19 11:25:12 INFO:Begin DLL registration for Server2 
2013-06-19 11:25:12 INFO:registered cimwin32.dll 
2013-06-19 11:25:12 INFO:End DLL registration for Server2 

回答

-5

我結束了與begining腳本使得整個的foreach一個變量: $ OUT = {的foreach .......}。 然後我在最後輸入變量

$ out |出文件$日誌文件

這裏有一個例子:

$out = foreach($server in $servers){ 
    invoke-command -cn $server -scriptblock { 
     Param($server) 
     "{0} :Begin DLL registration for {1}" -f (Get-Date -Format "yyyy-MM-dd HH:mm:ss"),$server 
    } -ArgumentList $server 
} 

$out | Out-File $logfile 
+5

你的答案是概念上等同於安斯加爾爲什麼添加它,接受你自己的答案作爲解決方案? I.m.o.這否認了Ansgar的回答值得信賴...... –

21

由於documented,Invoke-Command返回所有命令輸出,因此您可以使用Write-Output而不是Write-Host並將返回的輸出傳送到文件中。儘管如此,Write-Output並沒有花哨的顏色。但是,您可以使用Write-Output,Write-WarningWrite-Error將「Info」,「Warn」和「Error」級別消息寫入正確的流。此外,您可能想要抑制regsvr32的輸出。

foreach ($server in $servers) { 
    Invoke-Command -Computer $server -ScriptBlock { 
    Param($server) 

    Function write-log { 
     ... 
     switch ($Level) { 
     'Error' { Write-Error $msg } 
     'Warn' { Write-Warning $msg } 
     'Info' { Write-Output $msg } 
     } 
    } 

    write-log -message 'Begin DLL registration for $server' -level Info 
    $RegFile = "cimwin32.dll" 
    regsvr32 $RegFile /s | Out-Null 
    write-log -message 'registered $RegFile' -level Info 
    write-log -message 'End DLL registration for $server' -level Info 
    } -ArgumentList $server | Out-File -Append $masterLog 
}