Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Jak v BAT a v PowerShell na relativní cesty ke skriptům
leden 07
Jak v BAT a v PowerShell na relativní cesty ke skriptům

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.

Comments

Re: Jak v BAT a v PowerShell na relativní cesty ke skriptům

To je článok ako z duše, absolútne cesty sú dakedy peklo.

Akurát s $MyInvocation.MyCommand.Definition je drobný problém, že nefunguje vo funkciách. Ak mám ten luxus, že v prostredí je PowerShell 3, radšej používam $PSScriptRoot.
Michael Grafnetter on 7.1.2016 19:23

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