我有一个包含日志记录功能的脚本。 该函数将日志写入$ msg变量,然后将消息写入屏幕。 我可以将此输出重定向到.txt文件以进行记录。
我需要使用invoke-command将脚本运行到多个服务器 并将日志输出写入运行脚本的计算机上的txt文件。
我试图弄清楚如何在PSSession的write-log函数中输出$ 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
答案 0 :(得分:24)
作为documented,Invoke-Command
返回所有命令输出,因此您可以使用Write-Output
而不是Write-Host
并将返回的输出通过管道传输到文件中。但是Write-Output
并没有花哨的色彩。但是,您可以使用Write-Output
,Write-Warning
和Write-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
}
答案 1 :(得分:-4)
我最终通过开始使用以下脚本使整个foreach成为变量: $ out = Foreach {.......}。 然后我在最后输入变量
$ out | Out-File $ logfile
以下是一个示例:
$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