首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自invoke-command的Powershell日志记录

来自invoke-command的Powershell日志记录
EN

Stack Overflow用户
提问于 2013-06-20 02:01:05
回答 2查看 24.3K关注 0票数 4

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

我需要使用invoke-command在多个服务器上运行该脚本,并将日志输出写入运行该脚本的计算机上的txt文件。

我正在尝试弄清楚如何在写日志函数中从PSSession输出$msg并返回它,这样我就可以为所有服务器创建一个主日志文件。我应该创建并填充自定义对象吗?不确定如何做到这一点并从远程会话中获取结果。

这是否真的可以做到呢?

下面是我使用的代码示例以及日志文件输出应该是什么样子:

代码语言:javascript
复制
$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的日志输出应如下所示:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-21 21:29:44

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

$out |输出文件$logfile

下面是一个示例:

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2013-06-20 02:45:01

作为documentedInvoke-Command返回所有命令输出,因此您可以使用Write-Output而不是Write-Host,并将返回的输出通过管道传输到一个文件中。不过,Write-Output没有花哨的色彩。但是,您可以使用Write-OutputWrite-WarningWrite-Error将“信息”、“警告”和“错误”级别的消息写入正确的流。此外,您可能希望抑制来自regsvr32的输出。

代码语言:javascript
复制
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
}
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17198130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档