我有两个 PowerShell 类定义(文件和目录),每个类定义都在单独的 psm1 文件中:
文件.psm1
class File
{
[String]$Path
File([String]$Path)
{
$this.Path = $Path
}
}
目录.psm1
using namespace System.Collections.Generic
using module .\File.psm1
class Directory
{
[List[File]]$Files
[String]$Path
Directory([String]$Path)
{
$this.Path = $Path
$this.Files = [List[File]]::new()
if (Test-Path -Path $Path)
{
(Get-ChildItem -Path $Path -File).ForEach{
$this.Files.Add([File]::new($_.FullName))
}
}
}
}
所以目录类需要文件类的定义。
我想使用模块Testmodule1.psm1内的两个类。
psm1文件Testmodule1.psm1仅包含一个using module语句:
using module .\Directory.psm1
并且 psd1 文件Testmodule1.psd1引用Testmodule1.psm1作为根模块:
@{
ModuleVersion = "0.0.1"
RootModule = "TestModule1.psm1"
}
当我像这样导入模块时:
import-module .\TestModule1.psd1 -Force -Verbose
目录类别未知。
但是,当我按照Michael Phillips 在 SO 上建议的方式加载模块时,它可以工作:
我必须像这样导入模块:
$m1 = import-module .\TestModule1.psd1 -Force -PassThru
和
& $m1 { [Directory]::new("G:\Skriptkiste") }
现在找到了目录类型。
我已经使用 Windows PowerShell 和 PowerShell 7.4.5 对此进行了测试。
我的问题是:有没有更干净的方法来实现我的目标?
我知道这个问题在 SO 上引起了很多讨论。但我不相信对于在 PowerShell 模块中具有多个类定义(具有“依赖关系”)的要求,没有简单而干净的解决方案。
基于有用的评论:
不支持
class
enum
*.psm1
导出(和)除直接放置在PowerShell模块的根脚本模块文件()中的定义之外的定义是一个已知的限制(从PowerShell (Core) 7 v7.4.x 开始,尽管在不久的将来似乎不太可能修复)。引用about_Using帮助主题;重点补充:
正如已经指出的那样:
PowerShell 对定义的支持
class
不完整,并且有许多功能请求和错误报告;GitHub 问题 #6652是一个跟踪所有问题的元问题(截至撰写本文时,相当长一段时间内围绕这些问题的活动很少)。作为一种解决方法- 除了将所有
class
和enum
定义直接放在根模块中(如下所示)之外 - 您还可以使用构建工具,例如psake
,以便将不同的文件合并*.psm1
为一个文件,作为RootModule
模块清单条目中引用的文件。具体来说:
给定您的模块清单(
TestModule.psd1
),其RootModule
条目引用TestModule.psm1
,后者的内容必须如下所示,以便使[File]
和[Directory]
可供导入者使用(导入者必须使用using module
(而不是Import-Module
/ 模块自动加载)来导入模块,因为这是查看模块class
和enum
定义的基本先决条件):