出于多种原因,我有一个脚本想要迁移到PS5和类。这是一个很大的脚本,因此需要为各个类提供一些模块。但是,我的客户仍在使用Windows 7和PS2。我最初的想法是提供一种自动化PowerShell更新的方法,但据我所知,在模块中使用类的唯一方法是使用模块语句,该语句必须是脚本中的第一条语句。而且据我所知,任何试图在Windows 7 / PS2上运行该脚本的人都会遇到一个讨厌的错误,而且我没有机制来捕获该错误并提供日志或其他有意义的方式来传达正在发生的事情。 这是否是正确的评估,也许PS 5中的类还没有准备好应对这种情况?我曾希望在Classes的帮助下改用更好的日志记录,但是从它的外观来看,要么工作正常,要么我的脚本破了床,看上去真的很不专业。 :(
答案 0 :(得分:2)
如果使用两个版本的脚本是您前进的方向,但是您仍然希望避免代码重复,也许可以这样重构脚本:
具有三个文件script_main.ps1
,script_using_imports.ps1
和script_legacy.ps1
。
在script_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_using_imports.ps1
和script_legacy.ps1
中,根据需要处理模块/类的导入。
不确定这是否对您的用例有用,但这是一个主意!
我不得不参考this来弄清楚如何使用路径名。
答案 1 :(得分:0)
在PowerShell版本5之前的版本中,不能使用类或USING语句-语句根本不存在。您将需要
(1)维护脚本的两个版本,一个用于PowerShell 5+,一个用于PowerShell 4-,
(2)避免使用PowerShell 2中没有的任何cmdlet或语法,或者
(3)要求您的客户将WMF和.NET升级到支持PowerShell 5或更高版本的版本。