首页 > 解决方案 > 使用带有错误捕获的 Module 语句

问题描述

我有一个脚本,出于多种原因,我想迁移到 PS5 和 Classes。这是一个很大的脚本,因此需要为各种类提供一些模块。但是,我有一些客户仍在使用 Windows 7 和 PS2。我最初的想法是提供一种自动更新 PowerShell 的方法,但据我所知,在模块中使用类的唯一方法涉及 Using Module 语句,它必须是脚本中的第一个语句。而且据我所知,任何尝试在 Windows 7/PS2 上运行所述脚本的人都会遇到严重错误,我没有任何机制来捕获该错误并提供日志或其他有意义的方式来传达正在发生的事情. 这是一个正确的评估,也许 PS 5 中的课程还没有为这种情况做好准备?我曾希望在 Classes 的帮助下转向更好的日志记录,但从表面上看,要么事情正常,要么我的脚本把床弄得一团糟,看起来真的很不专业。:(

标签: powershellclass

解决方案


如果使用两个版本的脚本是你前进的方向,但你仍然想避免代码重复,也许可以这样重构你的脚本:

有三个文件,script_main.ps1,script_using_imports.ps1script_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.ps1and中script_legacy.ps1,您可以根据需要处理模块/类导入。

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


我不得不参考这个来弄清楚如何做路径名的东西。


推荐阅读