Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > BATáky nejsou mrtvé, používejte je na spouštění PowerShell naplánovaných úloh
květen 16
BATáky nejsou mrtvé, používejte je na spouštění PowerShell naplánovaných úloh

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:

cmd /C muScript.bat

Comments

pozor na vraceni hodnot do CMD

VasekB on 16.5.2013 22:59

Re: BATáky nejsou mrtvé, používejte je na spouštění PowerShell naplánovaných úloh

ondass on 7.1.2016 15:23

Kratsi zapis

Zapis %~d0%~p0%~n0.log je mozne skratit na %~dpn0.log, ci ten dlhsi zapis ma nejaku inu vyhodu?
Dawid on 8.1.2016 0:01

remote powershell

Prima na připojení (nikoliv naplánovaná úloha) remote PS např. na Exchange a na stroji, kde je execution policy restricted.

Jen je třeba doplnit za powershell.exe parametr "-NoExit".
VS on 13.1.2016 16:01

Add Comment

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments