Вот общая версия более специализированной функции ведения журнала, которую я недавно использовал для своего скрипта.
Сценарий для этого заключается в том, что, когда мне нужно сделать что-то в качестве запланированной задачи, я обычно создаю общий сценарий или функцию в модуле, который выполняет «тяжелую работу», а затем вызывающий сценарий, который обрабатывает особенности для конкретного задания, например получение аргументов из конфигурации XML, ведение журнала, уведомления и т. д.
Внутренний сценарий использует Ошибка записи, Предупреждение записи и Подробная запись, вызывающий сценарий перенаправляет все выходные потоки по конвейеру на этот функция, которая захватывает записи сообщений в CSV-файл с отметкой времени, уровнем и сообщением.
В данном случае он был нацелен на PoSh v.4, поэтому я в основном использую Write-Verbose в качестве замены для Write-Information, но с той же идеей. Если бы я использовал Write-Host в Some-Script.ps1 (см. Пример) вместо Write-Verbose или Write-Information, функция Add-LogEntry не захватила бы и не записала сообщение. Если вы хотите использовать это для соответствующего захвата большего количества потоков, добавьте записи в оператор switch в соответствии с вашими потребностями.
Переключатель -PassThru в этом случае, по сути, был способом точно решить то, что вы упомянули о записи в файл журнала в дополнение к выводу на консоль (или в другую переменную, или по конвейеру). В этой реализации я добавил к объекту свойство «Уровень», но, надеюсь, вы понимаете суть. Моим вариантом использования для этого была передача записей журнала в переменную, чтобы их можно было проверить на наличие ошибок и использовать в SMTP-уведомлении в случае возникновения ошибки.
function Add-LogEntry {
[CmdletBinding()]
param (
# Path to logfile
[Parameter(ParameterSetName = 'InformationObject', Mandatory = $true, Position = 0)]
[Parameter(ParameterSetName = 'Normal', Mandatory = $true, Position = 0)]
[String]$Path,
# Can set a message manually if not capturing an alternate output stream via the InformationObject parameter set.
[Parameter(ParameterSetName = 'Normal', Mandatory = $true)]
[String]$Message,
# Captures objects redirected to the output channel from Verbose, Warning, and Error channels
[ValidateScript({ @("VerboseRecord", "WarningRecord", "ErrorRecord") -Contains $_.GetType().name })]
[Parameter(ParameterSetName = 'InformationObject', Mandatory = $true, ValueFromPipeline = $true)]
$InformationObject,
# If using the message parameter, must specify a level, InformationObject derives level from the object.
[ValidateSet("Information", "Warning", "Error")]
[Parameter(ParameterSetName = 'Normal', Mandatory = $true, Position = 2)]
[String]$Level,
# Forward the InformationObject down the pipeline with additional level property.
[Parameter(ParameterSetName = 'InformationObject', Mandatory = $false)]
[Switch]$PassThru
)
Process {
# If using an information object, set log entry level according to object type.
if ($PSCmdlet.ParameterSetName -eq "InformationObject") {
$Message = $InformationObject.ToString()
# Depending on the object type, set the error level,
# add entry to cover "Write-Information" output here if needed
switch -exact ($InformationObject.GetType().name) {
"VerboseRecord" { $Level = "Information" }
"WarningRecord" { $Level = "Warning" }
"ErrorRecord" { $Level = "Error" }
}
}
# Generate timestamp for log entry
$Timestamp = (get-date).Tostring("yyyy\-MM\-dd\_HH\:mm\:ss.ff")
$LogEntryProps = @{
"Timestamp" = $Timestamp;
"Level" = $Level;
"Message" = $Message
}
$LogEntry = New-Object -TypeName System.Management.Automation.PSObject -Property $LogEntryProps
$LogEntry | Select-Object Timestamp, Level, Message | Export-Csv -Path $Path -NoTypeInformation -Append
if ($PassThru) { Write-Output ($InformationObject | Add-Member @{Level = $Level } -PassThru) }
}
}
Пример использования будет
& $PSScriptRoot\Some-Script.ps1 -Param $Param -Verbose *>&1 | Add-LogEntry -Path $LogPath -PassThru
Переключатель -PassThru должен, по сути, записывать информационный объект в консоль, если вы не захватываете вывод в переменной или не передаете его по конвейеру чему-то другому.
person
webward
schedule
28.03.2017