2013-06-19 4 views
2

У меня есть скрипт, который включает функцию для ведения журнала. Функция записывает журнал в переменную $ msg, затем записывает сообщение на экран. Я могу перенаправить этот вывод в TXT-файл для ведения журнала.Ведение журнала Powershell из команды invoke

Мне нужно запустить сценарий на нескольких серверах с помощью команды вызова и записать вывод журнала в файл txt на компьютере, на котором запущен скрипт.

Я пытаюсь выяснить, как вывести $ msg в функцию записи журнала из PSSession и вернуть его, чтобы я мог создать файл главного журнала для всех серверов. Должен ли я создавать и заполнять пользовательский объект? Не знаете, как это сделать и получить результаты с удаленного сеанса.

Можно ли это сделать?

Вот пример кода, который я использую и то, что выходной файл журнала должен выглядеть:

$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

Я закончил тем, что делает всю Foreach переменную, главную страницу скрипт с: $ из = Foreach {.......}. Затем я перекачивал переменную в конце

$ out | Out-File $ файл_журнала

Вот пример:

$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

Ваш ответ концептуально идентичен Ansgar так почему добавить его и принять свой собственный ответ, как решение? I.m.o. это отрицает ответ Ансгара, которого он заслуживает ... –

21

Как 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 
} 
Смежные вопросы