2011-09-11 13 views
13

Ho la seguente struttura di directory:Come posso chiamare un altro script PowerShell con un percorso relativo?

e:\powershell\services\This-Script-Here-Should-Call-Press any key to continue.ps1 
e:\powershell\utils\Press any key to continue.ps1 

e ora mi piacerebbe chiamare uno script chiamato "Premere un tasto per continue.ps1" che si trova nel "utils" -cartella da uno script che ho avere nella cartella "servizi". Come lo faccio? Non riesco a capire il percorso relativo.

ho cercato di fare in questo modo:

"$ '.\..\utils\Press any key to continue.ps1'" 

ma non ha funzionato.

+0

Eventuali duplicati: http://stackoverflow.com/q/6816450/2291 (sebbene questo non sia specifico per i percorsi relativi) –

risposta

21

In base a quello che stavi facendo, il seguente dovrebbe funzionare:

& "..\utils\Press any key to continue.ps1" 

o

. "..\utils\Press any key to continue.ps1" 

(occhiata la differenza tra l'utilizzo & e . e decidere quale usare)

Questo è come gestire queste situazioni (e leggera variazione a quello che @Shay menzionato):

$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path 
$utilsDir = Join-Path -Path $scriptDir -ChildPath ..\utils 

& "$utilsDir\Press any key to continue.ps1" 
+30

Un collegamento per & e. sarebbe stato carino Non esattamente espressioni di ricerca amichevoli di Google. –

+4

Nel caso in cui qualcun altro voglia capire il &, è una scorciatoia per "Invoke-Expression" - vedi http://technet.microsoft.com/en-us/library/ee176880.aspx –

+10

per coloro che hanno ancora problemi nel provare per trovare la differenza tra. e & guardare il seguente blog: http://rkeithhill.wordpress.com/2007/11/24/effective-powershell-item-10-understanding-powershell-parsing-modes/ TL; DR ". " chiama script e viene eseguito nello scope corrente "&" chiama lo script e viene eseguito in un ambito figlio diverso e viene gettato via – stanleykylee

5

Puy la seguente funzione nello script di chiamata per ottenere il suo percorso di directory e di aderire al percorso utils insieme al nome dello script:

# create this function in the calling script 
function Get-ScriptDirectory { Split-Path $MyInvocation.ScriptName } 

# generate the path to the script in the utils directory: 
$script = Join-Path (Get-ScriptDirectory) 'utils\Press any key to continue.ps1' 

# execute the script 
& $script 
+0

ci sono due problemi con questa soluzione: 1 ° - questo non è quello che sto cercando di ottenere perché la directory "ulits" non è una sottodirectory di "servizi" "e devo lasciare" servizi "e quindi inserire" utils "per chiamare lo script giusto. 2 °: ScriptName: la proprietà è vuota. Ho modificato la domanda in modo che sia più chiara. – t3chb0t

+0

Dipende molto dalla directory di lavoro della console (digita pwd nella tua console). Se si desidera utilizzare percorsi relativi è necessario prima effettuare il cd nella directory degli script di origine e quindi utilizzare .. \ folder \ script.ps1. Sei sicuro che Get-ScriptDirectory non restituisca la cartella principale dello script chiamante? –

+0

il mio male. Devo aver supervisionato qualcosa che la funzione Get-ScriptDirectory funzioni davvero. – t3chb0t

Problemi correlati