当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 7 跨平台脚本编写技巧和陷阱

作者:精品下载站 日期:2024-12-14 07:57:51 浏览:13 分类:玩电脑

PowerShell 7 跨平台脚本编写技巧和陷阱


您希望在桌面上采用 PowerShell 7 的原因之一是它可以跨平台使用。理论上,您可以编写适用于 Windows、Linux 和 Mac 的 PowerShell 脚本或函数。然而,这并非没有挑战。在某些方面,我们感觉就像回到了 PowerShell 脚本编写的早期,我们都在试图弄清楚该怎么做。根据我的经验,让我分享一些我认为您应该记住的想法。

请记住,我重点关注您将在脚本文件和模块中编写的 PowerShell 代码。交互式和跨平台使用 PowerShell 有其自己的一套规则。不过,让我补充一点,您跨平台交互工作的经验越多,编写跨平台代码就越容易。

无别名

PowerShell 脚本编写中长期建立的社区最佳实践是不使用命令和参数别名。在跨平台世界中,这一点更为重要。您可能习惯在代码中使用Sort来代替Sort-Object。我知道我有。我不介意改变无别名规则,因为排序没有什么神秘之处。

但在 Linux 世界中,sort 是一个本机命令。没有 PowerShell 别名。如果您的代码使用 sort,在 Linux 上它将调用本机命令,这很可能会破坏您的代码。

您现在需要养成使用完整 cmdlet 和参数名称的习惯。在带有 PowerShell 扩展的 Visual Studio Code 中,转换所有别名非常容易。在命令选项板中使用 PowerShell:展开别名或键盘快捷键 Shift+Alt+E

无 CIM

另一个需要注意的关键问题是非 Windows 平台上缺少 WMI 和 CIM。这可能并不令人意外。 CIM 支持是 Windows 管理框架的一部分。这个名字泄露了它。任何使用 CIM cmdlet 的脚本在非 Windows 系统上都将失败。这还包括像 Get-Volume 这样在幕后使用 CIM 的命令。如果您使用的命令具有 -CimSession 参数,则它将无法跨平台工作。

版本和版本测试

这意味着您需要在命令中包含额外的错误处理。您将需要检查诸如 $PSVersionTable 之类的项目。

[玩转系统] PowerShell 7 跨平台脚本编写技巧和陷阱

这是我在 Windows 上使用 PowerShell 7 的内容。

[玩转系统] PowerShell 7 跨平台脚本编写技巧和陷阱

和 Windows PowerShell。

[玩转系统] PowerShell 7 跨平台脚本编写技巧和陷阱

顺便说一下,您可以在 PowerShell 7 和 Windows PowerShell 上使用 $PSEdition 来获取与此处看到的相同的值。

除了测试 $PSVersionTable 中的值之外,还有许多可能会派上用场的新变量。

[玩转系统] PowerShell 7 跨平台脚本编写技巧和陷阱

Windows PowerShell 中不存在这些变量。这是您可以使用它们的一种方法。

if ($psedition -eq 'core' -AND $IsWindows) {
 "PS7 on Windows"
}
elseif ($psedition -eq 'core' -AND (-Not $IsWindows) ) {
 "PS7 on Linux OR MacOS"
}
elseif ($PSEdition -eq "Desktop" -AND ($psversiontable.PSVersion.Major -eq 5 -AND $psversiontable.PSVersion.Minor -eq 1)) {
 "Must be Windows PowerShell 5.1"
}
else {
   "All other Windows PowerShell versions"
}

测试很重要,而且可能很棘手。例如,即使您在 Linux 上的 PowerShell 7 中没有 Get-Ciminstance,但在 Windows 上却有。您需要熟悉 Get-Command 和 Get-Module,并能够在非 Windows 平台上运行它们。
这是一个代码片段,您可以使用它来验证代码的要求。

Try {
    Get-Command -name Get-Volume -erroraction stop
} 
Catch {
    Write-Warning "Command not available on this system."
    #bail out of the command
    return
}

如果您忽略了学习如何正确使用Try/Catch,那么现在就是一个好时机。您可能考虑添加的另一个选项是使用动态参数。这是一个复杂的话题,我不想在这里讨论。但您可以根据 PowerShell 风格动态定义命令的某些参数。

需要最低版本

如果您正在编写可能在不同 PowerShell 版本上运行的独立脚本,则需要在脚本开头插入 #requires 语句。

# requires -version 7.0

如果您使用 PowerShell 7 中的任何新功能(例如 ForEach-Object 的新并行参数),这一点非常重要。阅读about_requires帮助主题了解更多详细信息。

使用远程处理编写脚本

您可能合并的脚本元素是 PowerShell 远程处理。我经常使用此功能来使我的命令轻松扩展。您必须考虑的是您的命令将如何在远程计算机上使用。您可能需要使用清晰的文档定义单独的参数集,一组用于 Windows 计算机,另一组用于 Linux。或者 Windows PowerShell 与 PowerShell 7。

我喜欢 PowerShell 7 远程处理现在可以使用 ssh。如果您在远程计算机上启用并配置它,则可以在代码中使用ssh远程处理。或者,如果您有多种远程计算机,也许您编写的代码只接受 PSSession。代码的用户将负责创建 PSSession。有些会话可以使用 WinRM,有些会话可以使用 SSH。您的命令可以设计为从管道中获取 PSSession 数组,并且在内部您可以将它们传递给 Invoke-Command。当然,您仍然需要考虑其他错误处理、验证和测试。但这可能是管理多个远程系统的简单方法,无论它们运行的是 Windows 还是 Linux。

你的计划

这一切对你来说意味着什么?首先,我想说您需要熟悉 PowerShell 7 及其为聚会带来的所有新功能。假设您将在桌面上运行 PowerShell 7,您可以开始测试代码是否仍然有效。我尚未发现为 Windows PowerShell 编写的任何脚本或函数无法在 PowerShell 7 下本地运行。

假设您需要在远程服务器上使用 PowerShell 7,那么您可以开始评估需要管理的内容以及如何进行管理。我总是向学生强调,你必须考虑谁将运行你的代码。现在,你还必须考虑在哪里。

即使您的大部分脚本编写工作都是针对 Windows PowerShell,如果您开始关注 PowerShell 7 脚本编写要求,我认为您的代码整体质量也会提高。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯