我有一个PowerShell模块,它同时针对Windows PowerShell 5.1和PowerShell Core 6.0.在Windows PowerShell(桌面版)方面,它具有对.NET Framework 4.7.1的额外依赖性,以便正常工作.
当我最初创作模块时,我认为使用模块清单中的DotNetFrameworkVersion条目就足以认为PowerShell会强制执行最小化.
DotNetFrameworkVersion键
指定模块所需的最低.NET Framework版本.
我已经知道没有强制执行,我甚至不确定该字段的用途.在任何情况下,我都在尝试减少当人们尝试使用没有安装最低.NET Framework版本的模块时提交的支持问题.
在最近的版本中,我在模块的PSM1文件中添加了一些代码,这些代码将在加载模块时检查.NET Framework版本,如果找不到最小版本则抛出错误.
这似乎很有效,但只有手动导入模块时才有效Import-Module.如果您只是尝试运行其中一个模块函数并让PowerShell自动加载进行导入,则会导致导入错误被抑制,而您会得到一个相对一般的错误,例如:
Get-Blah:'Get-Blah'命令在模块'MyModule'中找到,但无法加载模块.有关更多信息,请运行"Import-Module MyModule".
我想相信用户会阅读消息,通过手动导入模块来执行它所说的内容,然后阅读/理解真正的错误消息.但我已经让用户提交了相反的问题.
所以现在我想知道.有没有更好的方法来解决这个问题?我是否将我的版本检查代码移出PSM1并进入每个公共功能?有什么比我更缺的东西吗?
这并不完全是您想要的,但是您发现的最接近的事情就是在 psm1 中进行版本检查,在Import-Module调用时对其进行评估。检查 Powershell 可用的当前 .NET 版本的一个简单方法是检查变量$PSVersionTable:
PS C:\> $PSVersionTable.CLRVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 30319 42000
Run Code Online (Sandbox Code Playgroud)
您可以分别检查主要、次要、构建和修订字段,或者使用以下命令检查完整的基于字符串的版本.ToString()
PS C:\> $PSVersionTable.CLRVersion.ToString()
4.0.30319.42000
Run Code Online (Sandbox Code Playgroud)
对于 .NET 4.5 及更高版本,最好检查注册表中的 .NET Release DWORD,而不是依赖 CLR 版本。从技术上讲,您仍然可以使用修订字段将 CLR 版本映射到 .NET 版本,但关于该主题的文档并不多。
$netFrameworkRelease = ( Get-ItemProperty -Path HKLM:\Software\Microsoft\NET Framework Setup\NDP\v4\Full ).Release
Run Code Online (Sandbox Code Playgroud)
然后,您可以将版本号映射到 .NET Framework 版本,如此处所述。
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |