default output

Windows_PowerShell_icondefault output

po napisaniu skryptu dobrze jest móc z niego korzystać zarówno z konsoli jak dodać go do np. do schedulera. w końcu to automatyzacja. taka uniwersalność wiąże się z odpowiednim oprogramowaniem tego, gdzie trafia output. PS daje wiele możliwości tego gdzie możemy wysłać dane… ale nie na przedefiniowanie ‘output-default’. w związq z tym pisze się nadmiarowy kod ‘jeśli ekran to wywal na ekran, jeśli log, to wywal do logu’. zazwyczaj pisałem funkcję wspierającą, która to załatwia. coś w tym rodzaju:

param(
[switch]$log
)
function out-my {
    param(
        [string[]]$info
        #[switch]$log
    )
    if($log) { $info|out-file -FilePath $logPath }
    else { $info|out-host }
    
}

$logPath=$($MyInvocation.MyCommand.Name)+$(get-date -Format ddMMyy.hhmmss)+".log"

out-my (Get-Process)

to nie jest w pełni działający kod i ma tyle wad, że ciężko zliczyć. zależnie od przekazywanej zmiennej zachowa się inaczej w porywach do ‘nie zadziała’.

jak to zrobić PowerShell-way

są dwa mechanizmy, które pozwalają na uproszczenie całej procedury: aliasy oraz możliwość przedefiniowania standardowej wartości parametru dla commandletu. sam alias nie wystarczy bo o ile out-host nic nie potrzebuje o tyle przekierowanie do pliq wymaga co najmniej nazwy tego pliq…

<#
.SYNOPSIS
example how to redefine output with single switch
#>
param(
    [switch]$log
    #batch mode - output to logfile
)
#logname: scriptname+date+time+log
$logPath=$((Get-ChildItem $MyInvocation.MyCommand.Name).basename )+$(get-date -Format ddMMyy.hhmmss)+".log"
#set default value of out-file to logname
$PSDefaultParameterValues=@{"out-file:filepath"=$logPath;"out-file:append"=$true}
#define alias out-my depend on $log switch
if($Log) { Set-Alias -Name out-my -Value Out-File } else { Set-Alias -Name out-my -Value out-host }

Get-Process|out-my

w skrócie:

w zależności od przełącznika ‘log’ tworzony jest alias ‘out-my’ wskazujący albo na out-host albo na out-file. ponieważ out-file wymaga podania nazwy pliq, aby można było użyć aliasu bez parametru, ustawiona jest standardowa wartość poprzez $PSDefaultParameterValue

eN.