【问题标题】:Powershell logging from invoke-command来自调用命令的 Powershell 日志记录
【发布时间】:2013-06-16 09:27:51
【问题描述】:

我有一个包含日志记录功能的脚本。 该函数将日志写入 $msg 变量,然后将消息写入屏幕。 我可以将此输出重定向到 .txt 文件以进行日志记录。

我需要使用调用命令将脚本运行到多个服务器 并将日志输出写入运行脚本的计算机上的 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

【问题讨论】:

    标签: powershell powershell-2.0 powershell-remoting


    【解决方案1】:

    由于documentedInvoke-Command 返回所有命令输出,因此您可以使用Write-Output 而不是Write-Host 并将返回的输出通过管道传输到文件中。不过,Write-Output 没有花哨的颜色。但是,您可以使用Write-OutputWrite-WarningWrite-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
    }
    

    【讨论】:

      【解决方案2】:

      我最终将整个 foreach 变成了一个变量,脚本的开头是: $out = Foreach{.......}。 然后我在最后通过管道传递变量

      $out |输出文件 $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
      

      【讨论】:

      • 您的答案在概念上与 Ansgar 相同,那么为什么要添加它并接受您自己的答案作为解决方案呢?我。这否认了 Ansgar 应得的回答......
      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 2012-03-26
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2020-08-18
      相关资源
      最近更新 更多