2016-04-25 32 views
2

我是PowerShell的新手,在定義其他文件中「包含」的某些實用程序腳本時遇到了一些問題;問題是關於路徑。讓我用一個簡單的例子來解釋這個問題:在PowerShell中正確引用腳本

想象一下,你有一些名爲utility.ps1的實用程序腳本位於/ tools下,並且你想從位於/ build下的build.ps1中調用它。現在想象一下utility.ps1調用一個名爲「utility2.ps1」的文件夾中的其他實用程序腳本。所以,

utility.ps1

[...] 
.".\utility2.ps1" 
[...] 

build.ps1

[...] 
."..\tools\utility.ps1" 
[...] 

這裏的問題是,從構建打電話時從這個最後utility.ps1然後一個用於utility2.ps1,powershell試圖從當前目錄(build)加載utility2.ps1而不是工具目錄。

我現在的解決方法是pushd .打電話之前和popd之後,但它聞起來不好,我知道;另一方面,如果有一天我將腳本移動到其他位置,我需要更新所有使用移動腳本的腳本......一團糟。

所以,我做的事情非常錯誤;什麼是適當的這樣做,使客戶端腳本不知道和「效用」腳本位置獨立?

+0

'$ PSScriptRoot' – PetSerAl

+0

能否請你解釋一下?我已經看到這個鏈接:http://stackoverflow.com/questions/6874779/powershell-include-another-script-that-has-includes,但要記住,我有一些間接的依賴關係,我不知道,從任何實用程序腳本中,$ PSScriptRoot中存儲了什麼值,所以我不能假定我應該移動到父目錄的多少個步驟等。 – Luis

+2

** utility.ps1 **:'。「$ PSScriptRoot \ utility2.ps1」' ,** build.ps1 **:'。「$ PSScriptRoot \ .. \ tools \ utility.ps1」'。 – PetSerAl

回答

3

PetSerAl在評論中給出的答案是完美的,但對於PowerShell 3+將起作用。如果你希望你的腳本爲向後兼容,以及某些原因,然後用下面的代碼片段找到$ ScriptRootPath(這是通過$ PSScriptRoot自動填充PS 3+)

$ScriptRootPath = Split-Path $MyInvocation.MyCommand.Path -Parent 

對於PS 3+經由全局變量填充此變量:

$ScriptRootPath = $PSScriptRoot 

,然後使用該溶液作爲由PetSerAl描述,
即用於utility.ps1:. "$ScriptRootPath\utility2.ps1"
個build.ps1:. "$ScriptRootPath\..\tools\utility.ps1"

另請參閱this question on SO

相關問題