La funzione PowerShell Write-ToLog permette di scrivere su un file di log testuale e, contemporaneamente, in console

PowerShell: Write-ToLog

function Write-ToLog {
    Param (
        [parameter(Mandatory=$true, HelpMessage="Message string")]
        [ValidateNotNullOrEmpty()]
        [string] $message,
        [parameter(HelpMessage="Foreground color message")]
        [AllowEmptyString()]
        [string] $ForegroundColor='white',
        [parameter(HelpMessage="Do not write on the console")]
        [switch]$NoHost = $false,
        [parameter(HelpMessage="Do not write on the file log")]
        [switch]$NoFile = $false
    )
    $m = "$(get-date): $message"
    if($WriteToLogFullFileName -eq $null){
        Set-ToLog "SgartIT"
    }
    if($NoFile -eq $false) {
        $m >> $WriteToLogFullFileName
    }
    if($NoHost -eq $false) {
        Write-Host $m -ForegroundColor $foregroundColor
    }
}
function Set-ToLog {
    Param (
        [parameter(Mandatory=$true, HelpMessage="Enter the file name of log file witout extension")]
        [ValidateNotNullOrEmpty()]
        [string] $fileName
    )
    Set-Variable -Name WriteToLogFileName -Value $fileName -Scope Script -Visibility public
    Set-Variable -Name WriteToLogFullFileName -Value "$pwd\$WriteToLogFileName`_$(get-date -Format yyyMMdd).log" -Scope Script -Visibility public
}

Per utilizzarla è sufficiente richiamare funzione Write-ToLog:

PowerShell

Write-ToLog "mio messaggio" -ForegroundColor red
in questo caso scrivo un messaggio di log sulla console (in rosso) e su un file definito con Set-ToLog.
Questo è il risultato:

DOS / Batch file

09/13/2013 12:53:37: mio messaggio

Il nome di default del file di log è SgartIT_yyyyMMdd.log e viene scritto nel percorso corrente ($pwd).
Il prefisso SgartIT può essere cambiato tramite la funzione:

PowerShell

Set-ToLog "nuovo prefisso del file"
Si possono usare anche gli switch NoHost e NoFile rispettivamente per NON scrivere sulla console e NON' scrivere su file:

PowerShell

Write-ToLog "mio messaggio" -NoHost
in questo caso scrivo il messaggio solo su file.

Variante

Questa è una variante della funzione Write-ToLog che permette di scegliere ogni quanto creare un nuovo file di log (mensilmente, giornalmente, ogni ora, con file name univoco) tramite la funzione Get-FileNameWithDate

PowerShell: Write-ToLog enhanced

function Write-ToLog {
    Param (
        [parameter(Mandatory = $true, HelpMessage = "Message string")]
        [ValidateNotNullOrEmpty()]
        [string] $message,

        [parameter(HelpMessage = "Foreground color message")]
        [AllowEmptyString()]
        [string] $ForegroundColor = 'white',

        [parameter(HelpMessage = "Do not write on the console")]
        [switch]$NoHost = $false,

        [parameter(HelpMessage = "Do not write on the file log")]
        [switch]$NoFile = $false
    )
    $m = "$(get-date -Format "yyyy-MM-dd HH:mm:ss") $message"

    if ($null -eq $WriteToLogFullFileName) {
        Set-ToLog
    }
    if ($NoFile -eq $false) {
        $m >> $WriteToLogFullFileName
    }
    if ($NoHost -eq $false) {
        Write-Host $m -ForegroundColor $foregroundColor
    }
}
function Get-FileNameWithDate {
    param (
        [Parameter(Mandatory = $true, HelpMessage = "Prefix for file name")]
        [string] $filePrefix,

        [parameter(HelpMessage = "Period for create a new file")]
        [ValidateSet("Montly", "Daily", "Hourly", "Time", "Unique", "UniqueWithTime")]
        [string] $period = "Daily",

        [parameter(HelpMessage = "File extension")]
        [string] $extension = "txt"
    )


    if ($period -eq "Hourly") {
        $dtString = (get-date -Format "yyyyMMdd-HH");
    }
    elseif ($period -eq "Montly") {
        $dtString = (get-date -Format "yyyyMM");
    }
    elseif ($period -eq "Time") {
        $dtString = (get-date -Format FileDateTime);
    }
    elseif ($period -eq "Unique") {
        $dtString = "$([System.Guid]::NewGuid().toString("N"))";
    }   
    elseif ($period -eq "UniqueWithTime") {
        $dtString = "$(get-date -Format "yyyyMMdd-HHmmss")-$([System.Guid]::NewGuid().toString("N"))";
    }   
    else {
        $dtString = (get-date -Format FileDate); # yyyyMMdd
    }

    # return value
    "$($filePrefix)_$dtString.$extension"
}

function Set-ToLog {
    Param (
        [parameter(HelpMessage = "Enter the prefix of file name")]
        [string] $filePrefix = "sgart",

        [parameter(HelpMessage = "Enter the path of folder logs")]
        [string] $path = "$pwd\logs",

        [parameter(HelpMessage = "Period for create a new file")]
        [ValidateSet("Montly", "Daily", "Hourly", "Time", "Unique", "UniqueWithTime")]
        [string] $period = "Daily"
    )


    if ((Test-Path $path) -eq $false) {
        New-Item -ItemType "directory" -Path $path
    }

    $fileName = Get-FileNameWithDate -filePrefix $filePrefix -Period $period -Extension "log"
    Set-Variable -Name WriteToLogFullFileName -Value "$path\$fileName" -Scope Script -Visibility public
}
come prima cosa va inizializzato il log con Set-ToLog

PowerShell: Initialize

$ScriptNameNoExtension = [System.IO.Path]::GetFileNameWithoutExtension($PSCommandPath)

Set-ToLog $ScriptNameNoExtension "$PSScriptRoot\logs" -Period Hourly
il parametro Period può assumere uno di questi valori: Montly, Daily, Hourly, Time, Unique e UniqueWithTime.
Tags:
PowerShell200 Script85 Utility59
Potrebbe interessarti anche: