簡體   English   中英

點源文件中的PowerShell點源 - 導入類

[英]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 moduleTesla模塊導入Car模塊, MyScript.ps1腳本使用相對於封閉腳本/模塊位置的路徑導入Tesla模塊。

    • 警告 :從PowerShell Core 6.1.0-preview.4開始,有一個錯誤需要你使用\\作為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM