首页 > 解决方案 > 如何正确导入类使用的模块?

问题描述

我写了一个脚本来唤醒 lan 客户端,具体取决于他们在我们的 sccm 服务器上的组

脚本的当前状态使用 6 个类和 3 个参数。我的问题是,这些类使用我必须导入的模块的类型和功能。但是,如果在启动脚本之前没有在 PowerShell 会话中导入模块,则脚本会在出现 TypeNotFound 错误时运行并终止。

在参数和类之间放置 Import-Module 并不能解决问题。将 Import-Module 放在参数之前会破坏参数声明。

在我看来,PowerShell 编译器首先查看类,然后运行所有非类操作。

Dot-Sourcing 是由于公司限制在环境中不可能

我有什么问题吗?我该如何解决这个问题?

脚本(大大缩短):

param(
    
    [switch] $Herunterfahren,
    [switch] $Starten,
    [Boolean] $Test = $True

)

Import-Module Matrix42.SDK.Empirum.Powershell -ErrorAction Stop
Import-Module admpwd.ps -ErrorAction Stop

Class JsonSettings {
}

Class Logger {
}

Class EmpirumConnector {

    [Boolean] $isConnected = $False

    hidden [String] $encryptedPassword
    hidden [String] $serverAddress
    hidden [String] $databaseUser
    hidden [int] $port
    hidden [String] $protocol
    hidden [Boolean] $secureConnection

    hidden [Matrix42.SDK.Contracts.ISession] $connection = $null

    hidden [String] $logModule = 'Empirum'

}

Class RemoteControl {
}

Class StartClients {
}

Class ShutdownClients {
}

[Logger]::GetInstance().Info('Starter', 'call with params', [PSCustomObject]@{
    Herunterfahren = $Herunterfahren
    Starten = $Starten
    Test = $Test
}, $null)

if ($Herunterfahren -and $Starten) {
    [Logger]::GetInstance().Error('Starter', "illegal call with params. Herunterfahren and Starten not allowed")
} elseif (-not $Herunterfahren -and -not $Starten) {
    [Logger]::GetInstance().Error('Starter', "illegal call with params. Herunterfahren or Starten must be present")
} elseif ($Starten) {
    [StartClients]::new().run()
} elseif ($Herunterfahren) {
    [ShutdownClients]::new().run()
}

[Logger]::GetInstance().SaveToXml()

确切的问题是:EmpirumConnector 类使用 Matrix42.SDK.Contracts.ISession 类型作为 Matrix42.SDK.Empirum.Powershell 模块中包含的连接属性。

标签: powershellclassimportpowershell-5.0

解决方案


如果你想在解析时加载一个模块,你必须用一个using module语句声明它:

using module Matrix42.SDK.Empirum.Powershell
using module admpwd.ps

param(
    [switch] $Herunterfahren,
    [switch] $Starten,
    [Boolean] $Test = $True
)

Class EmpirumConnector {

    [Boolean] $isConnected = $False

    hidden [String] $encryptedPassword
    hidden [String] $serverAddress
    hidden [String] $databaseUser
    hidden [int] $port
    hidden [String] $protocol
    hidden [Boolean] $secureConnection

    hidden [Matrix42.SDK.Contracts.ISession] $connection = $null # this can now be resolved by the type definer

    hidden [String] $logModule = 'Empirum'

}

# ...

推荐阅读