default 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.