Nezapomínejte na BATáky. I v dnešní době, kdy všichni baží po PowerShellu jsou velmi užitečné. Co když chcete udělat třeba naplánovanou úlohu v jazyce PowerShell. Dobře, založíte si PS1 soubor, jenže ten se nespouští jen tak. Brání vám v tom výchozí nastavení execution policy. To se sice dá prozkoumat a případně změnit pomocí cmdletů Get-ExecutionPolicy a Set-ExecutionPolicy, nebo i přes GPO centrálně (zásada Turn on Script Execution).
Jenže co když se vám to zrovna měnit nechce? Nebo děláte skript, který má běžet i na jiných počítačích, které nemáte ve správě? Nebo byste si rádi udělali nějaký log?
Osobně spouštím PowerShell skripty z BAT souborů. Příkaz ke spuštění PS1 skriptu bez ohledu na execution policy je tento:
powershell -ExecutionPolicy Bypass -File myScript.PS1
To je sice hezké, ale já si to do BAT souboru vylepšuju ještě následovně. Udělám si BAT soubor se stejným názvem jako je PS1 soubor. A budu si generovat i log s výstupem toho PS1 skriptu pomocí přesměrování:
myScript.bat
myScript.log
myScript.ps1
Obsah BAT souboru je potom následující, navíc totálně univerzální:
whoami /all > "%~d0%~p0%~n0.log"
powershell -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %* > "%~d0%~p0%~n0.log"
exit /B %errorlevel%
BAT soubor je univerzální, protože speciální úpravy parametrů %~d0%~p0%~n0 nahrazují jeho jméno. %~d0 je písmeno disku, kde je BAT soubor, %~p0 je cesta k adresáři s tím BAT souborem a %~n0 je jméno BAT souboru bez přípony.
Ano, jedná se o cestu k BAT souboru, nikoliv do aktuálního adresáře. Takže je úplně jedno, jestli a jak se ten BAT soubor spouští. Je to vždycky absolutní cesta k jeho zdrojovému souboru.
Naplánovanou úlohu potom spouštím pomocí CMD následovně. Opět mám jistotu, že se to spustí a že to fakt pojede: