2011-09-11 14 views
13

Aşağıdaki dizin ağacı vardır:Göreli bir yolla başka bir PowerShell betiğini nasıl ararım?

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

ve şimdi bir komut dosyasından "utils" klasöründe dosyalanır oturur o "continue.ps1 için herhangi bir tuşa basın" adlı bir senaryo aramak istiyorum ben "hizmetler" klasöründe var. Bunu nasıl yaparım? Göreli yolu anlayamıyorum.

ben bu şekilde yapmaya çalıştık:

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

ama işe yaramadı.

+0

Olası yinelenen: http://stackoverflow.com/q/6816450/2291 (bu, göreceli yollara özgü olmasa da) –

cevap

21

aşağıdaki çalışması gerekir:

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

veya

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

(kullanılarak arasındaki farkı aramave . ve

Bu Böyle durumları (ve @Shay sözü ne hafif bir değişim) nasıl ele olduğu) kullanmak için bir karar:

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

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

& ve için bir bağlantı. Hoş olurdu. Tam olarak Google dostu arama ifadeleri değil. –

+4

Başka birinin, "Invoke-Expression" ifadesinin kısayolunu öğrenmek istemesi durumunda, hala sorun yaşamaya çalışanlar için http://technet.microsoft.com/en-us/library/ee176880.aspx –

+10

adresine bakın. arasındaki farkı bulmak için. ve & aşağıdaki blogda bakmak: http://rkeithhill.wordpress.com/2007/11/24/effective-powershell-item-10-understanding-powershell-parsing-modes/ TL; DR ". " komut satırı çağırır ve geçerli kapsamda çalışır "&" çağrıları komut dosyası ve farklı bir çocuk kapsamı içinde çalışır ve atılır – stanleykylee

5

Puy çağıran komut dosyasında aşağıdaki işlevi dizin yolunu almak ve komut adıyla birlikte utils yolunu katılmak için: ne yaptığını dayanarak

# 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

Bu çözümle ilgili iki sorun var: 1 - bu "üls" dizininin "hizmetlerin bir alt dizini olmaması" için yapmaya çalıştığım şey değil "ve" hizmetleri "terk etmeli ve sonra doğru komut dosyasını çağırmak için" utils "yazmalıyım. 2nd - ScriptName-Property boş. Soruyu düzenledim, böylece daha net. – t3chb0t

+0

Bu gerçekten konsol çalışma dizinine bağlıdır (konsolunuzdaki pwd yazın). Göreceli yolları kullanmak istiyorsanız, önce kaynak komut dizini içine cd yazmanız ve ardından .. \ folder \ script.ps1 kullanın. Get-ScriptDirectory öğesinin çağıran komut dosyasının üst klasörünü döndürmediğinden emin misiniz? –

+0

kötüyüm. Get-ScriptDirectory işlevinin gerçekten işe yaradığı bir şey izlemiş olmalıyım. – t3chb0t

İlgili konular