Powershell 使用带有错误捕获的Module语句

Powershell 使用带有错误捕获的Module语句,powershell,class,Powershell,Class,我有一个脚本,我想迁移到PS5和类的原因有很多。这是一个很大的脚本,因此需要为不同的类提供一些模块。但是,我有一些客户仍然在使用Windows7和PS2。我最初的想法是提供一种自动化PowerShell更新的方法,但据我所知,在模块中使用类的唯一方法是使用Module语句,这必须是脚本中的第一条语句。而且,据我所知,任何试图在Windows7/PS2上运行上述脚本的人都会遇到严重错误,我没有任何机制来捕捉该错误并提供日志或其他有意义的方式来交流正在发生的事情。 这是正确的评估吗?也许PS5的课程

我有一个脚本,我想迁移到PS5和类的原因有很多。这是一个很大的脚本,因此需要为不同的类提供一些模块。但是,我有一些客户仍然在使用Windows7和PS2。我最初的想法是提供一种自动化PowerShell更新的方法,但据我所知,在模块中使用类的唯一方法是使用Module语句,这必须是脚本中的第一条语句。而且,据我所知,任何试图在Windows7/PS2上运行上述脚本的人都会遇到严重错误,我没有任何机制来捕捉该错误并提供日志或其他有意义的方式来交流正在发生的事情。
这是正确的评估吗?也许PS5的课程还没有准备好应付这种情况?我曾希望借助于类的帮助,转向更好的日志记录,但从表面上看,要么事情进展顺利,要么我的脚本让人大吃一惊,看起来真的很不专业(

您不能在早于5的PowerShell版本中使用类或USING语句,句号-这些语句根本不存在。您需要

(1) 维护两个版本的脚本,一个用于PowerShell 5+,另一个用于PowerShell 4-

(2) 避免使用PowerShell 2以外的任何cmdlet或语法,或


(3) 要求您的客户将WMF和.NET升级到支持PowerShell 5或更高版本的版本。

如果使用两个版本的脚本是您的方向,但您仍希望避免代码重复,则可能需要重构您的脚本:

有三个文件,
script\u main.ps1
script\u using\u imports.ps1
,和
script\u legacy.ps1

script\u main.ps1
中,执行以下操作:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
if (getPowershellVersion() > $VersionNeeded) { #Pseudocode function names
    $scriptFile = "script_using_imports.ps1"
} else {
    $scriptFile = "script_legacy.ps1"
}

get-content -path "$scriptPath\$scriptFile" -raw | invoke-expression

# The rest of main goes on assuming imports worked.
然后在
script\u中使用_imports.ps1
script\u legacy.ps1
,您可以根据需要处理模块/类导入

不确定这是否有助于您的用例,但这是一个想法



我必须参考一下,才能弄清楚如何使用路径名。

这太难看了。但我一直在考虑一个古怪的解决方案。一个兼容PS2.0的“启动器”这将获取所需的参数,验证一切是否正常,并将参数传递给真正的脚本(如果是)。如果不是,它可以处理日志记录。我明天可能会玩它,看看它有多难看。:)有趣的方法。我一般都避免调用表达式,主要是出于安全考虑,但如果我事先检查代码签名,这可能不是问题。本周末还有更多内容要探讨。这种方法的一个警告是,在使用函数时,您将无法控制哪些函数被导出,哪些函数保持本地。也许不是所有函数都公开的问题,但我刚刚注意到了一点。而且,我认为即使没有两个版本,这也有潜力。通过这种方法,我可以编写一些测试PS5的代码,如果找不到它,就会启动安装并重新启动脚本。当PS5存在时,模块可在条件测试后“可用”。我不知道为什么微软不允许使用模块以这种方式工作。无论是有意还是缺乏远见,使用该模块都会让人感觉到自己被削弱了(