[英]PowerShell dot source within a dot sourced file - import classes
我的項目結構如下:
MyScript.ps1
classes\
Car.ps1
Tesla.ps1
Car.ps1是Tesla.ps1的基類。 我試圖在Tesla.ps1中定義這樣的特斯拉:
. "$PSScriptRoot\Car.ps1"
class Tesla : Car
{
}
MyScript.ps1需要使用Tesla類,但不需要知道它繼承自Car。
. "$PSScriptRoot\classes\Tesla.ps1"
$tesla = [Tesla]::new()
點源到classes\\Tesla.ps1
工作正常,但這個錯誤是從特斯拉文件拋出的:
找不到類型[Car]
如果我在MyScript.ps1中以正確的順序導入所有文件,它可以正常工作。 例:
. "$PSScriptRoot\classes\Car.ps1"
. "$PSScriptRoot\classes\Tesla.ps1"
$tesla = [Tesla]::new()
這很麻煩,特別是隨着復雜性的增加。 我的點源不正確嗎? 是否有更好的方法使用不在PSModulePath中的相對路徑導入自定義PowerShell類?
PetSerAl ,無數次,在這個問題的簡短評論中提供了關鍵指針:
由於您使用了類 ,您必須使用模塊並using module
語句導入它們才能使用它們。
不幸的是,在撰寫本文時, Get-Help about_Modules
仍未提及using module
。
具體來說, 為了引用class
定義中的類型(類),PowerShell必須在分析時知道該類型 。
在您的示例中,為了從類Car
派生Tesla
, 在 解析腳本時, 在執行開始之前必須知道PowerShell類型為Car
,這就是為什么現在通過點源其包含腳本來導入Car
為時已晚 ( . "$PSScriptRoot\\Car.ps1"
)
PowerShell以兩種方式之一了解解析時的引用類型:
如果該類型已加載到當前的PowerShell會話中
通過using module
語句引用其中定義了類型(類)的模塊(請注意,還有一個using assembly
語句用於從DLL加載類型,並using namespace
來啟用類型名稱引用類型)。
Import-Module
cmdlet 不會在這種情況下工作,因為它執行在運行時 。 因此,正如PetSerAl建議:
將類存儲在模塊文件中 (最簡單的情況是獨立的*.psm1
文件)
然后使用using module
讓Tesla
模塊導入Car
模塊, MyScript.ps1
腳本使用相對於封閉腳本/模塊位置的路徑導入Tesla
模塊。
\\
作為using module
相對路徑中的路徑分隔符,即使在類似Unix的平台上,你通常使用/
。 MyScript.ps1
classes\
Car.psm1 # Note the .psm1 extension
Tesla.psm1 # Ditto
Car.psm1
:
class Car {}
Tesla.psm1
:
using module .\Car.psm1
class Tesla : Car {}
MyScript.ps1
:
using module .\classes\Tesla.psm1
$tesla = [Tesla]::new()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.