powershell - 如何正确导入类使用的模块?
问题描述
我写了一个脚本来唤醒 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 模块中包含的连接属性。
解决方案
如果你想在解析时加载一个模块,你必须用一个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'
}
# ...
推荐阅读
- html - 使某些对象在点击时不可见,仅使用 HTML 和 CSS,无需 JS 或 jQuery
- mysql - Docker 设置 mysql 数据库
- python - Python根据maxchars字符串长度边界返回要打印的切片列表
- postgresql - 使用行级安全性 (RLS) 时如何使 INSERT ... RETURNING 语句起作用?
- python-3.x - 导入失败并出现 KeyError: 'id'
- typescript - 为什么 prettier 要在我的 IIAFE 前加上“;”?
- javascript - 我如何摆脱这个数组中的逗号?
- mysql - Mysql:从另一个表更新表的所有列
- flutter - Flutter 如何在这个框架中构建自己的滚动物理?
- regex - 正则表达式:用“@”替换“@@”,用一些字符串替换“@”