Zrovna jsem narazil na jednu poměrně nepříjemnou věc - přesun balíku skriptů z jednoho diskového adresáře do jiného. Ach jo. Asi dvacet skriptů obsahuje absolutní cesty, každý několik. Musí se to všechno opravit. Základní pohodlnost velí napsat to tak, aby se ty skripty neodkazovaly na žádný konkrétní adresář.
Jak PowerShell tak i BAT se umí odkazovat přímo na cestu, ve které je ten který zdrojový soubor se skriptem. Tak proč to nevyužít?
Takže jak použije v PowerShell a v BAT relativní cestu?
Uvnitř BAT a CMD souborů se dají použít speciální proměnné %~d0 a %~p0. Proměnná %~d0 se přeloží na písmeno disku, kde leží zdrojový BAT/CMD soubor. Proměnná %~p0 se přeloží na cestu k adresáři, ve kterém je ten BAT soubor. Příklad o tom, jak třeba vypsat obsah ipconfig do nějakého logového souboru ve stejném adresáři by mohl vypadat takto:
ipconfig > %~d0%~p0testovacilog.txt
Všimněte si jenom toho, že za proměnnou %~p0 už není lomítko, protože ta proměnná vždycky obsahuje koncové lomítko.
V případě PowerShellu je nutné si cestu do adresáře, ve kterém je daný zdrojový PS1, nebo PSM1 soubor zjistit takto:
$baseDir = Split-Path -parent $MyInvocation.MyCommand.Definition
ipconfig > (Join-Path $baseDir testovacilog.txt)
Zase bych upozornil na použití cmdlet Join-Path, který bezpečně spojí dvě cesty bez ohledu na to, jestli je v nich na koncí respektive začátku lomítko, nebo není.
Spouštění PS1 souborů v naplánovaných úlohách
Optimálně je plánovat úlohu (scheduled task) jako BAT soubor, ze kterého spouštíte stejně pojmenovaný PS1 soubor. O tom jsem tu už před nějakou dobou pojednával. Tam používám ještě i proměnnou %~n0, která obsahuje jméno zdrojového CMD/BAT souboru.
Takže za málo muziky maximální pohodlnost.