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

[玩转系统] 适用于 Linux 的 PowerShell 脚本仍然与对象有关

作者:精品下载站 日期:2024-12-14 07:55:33 浏览:16 分类:玩电脑

适用于 Linux 的 PowerShell 脚本仍然与对象有关


我一直在努力提高我的 Linux 技能,特别是当我开始编写可以跨平台工作的 PowerShell 脚本和工具时。我想确保您不要忽视一个非常重要的概念,即即使在为非 Windows 平台编写脚本时,您仍然必须考虑对象。假设您编写的 PowerShell 命令是为了与其他 PowerShell 命令共存和互操作。因此,即使 Linux 和 MacOS 是基于文本的,您也需要使用对象。

Linux 对象命令

作为一个例子,考虑这个 Linux 命令。

[玩转系统] 适用于 Linux 的 PowerShell 脚本仍然与对象有关

该命令正在将字符串写入管道,即使它看起来像一个对象。为什么不把它变成一个对象呢?我可以将输出拆分为字符串数组,然后使用 : 作为分隔符将每行拆分为两部分。

[玩转系统] 适用于 Linux 的 PowerShell 脚本仍然与对象有关

哈希表 $h 成为对象的前体。顺便说一下,我删除了空格,以便属性名称中没有空格。

让我们直接跳到成品。

跨平台参考功能

#requires -version 6.2
#requires -psedition Core

<#
Convert this output:

Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04

into a PowerShell object

Requires LSB-Core package
# https://www.computerhope.com/unix/lsb_release.htm
#>

Function Get-LinuxLSB {
    [cmdletbinding()]
    [alias("lsb")]
    [outputtype("LinuxLSB")]
    Param(
        [Parameter(Position = 0)]
        [ValidateNotNullorEmpty()]
        [string]$Hostname = [Environment]::Machinename,
        [Parameter(Position = 1)]
        [ValidateNotNullorEmpty()]
        [string]$UserName
    )

    Write-Verbose "Starting $($myinvocation.MyCommand)"
    #define a scriptblock to run locally or remotely
    $sb = {
        if ($isLinux) {
            try {
                $app = Get-Command -Name lsb_release -erroraction stop
                $ok = $True
            }
            catch {
                Write-Warning "This command relies on lsb_release. You may need to install the lsb-core package."
                $ok = $false
            }
            if ($ok) {
                $data = (lsb_release -idr) -split "`n"
                $data | ForEach-Object -Begin { $h = [ordered]@{PSTypename = "LinuxLSB" } } -Process {
                    $s = $_.split(":")
                    Write-Verbose "Adding $s[0]"
                    $h.add($s[0].Replace(" ", ""), $s[1].trim())
                } -end {
                    $h.Add("Computername", [environment]::MachineName)
                    New-Object -TypeName PSObject -Property $h
                }
            }
        }
        else {
            Write-Warning "This command requires a Linux distribution"
        }

    } #close scriptblock

    Write-Verbose "Querying $hostname"
    if ($Hostname -eq [Environment]::Machinename) {
        Invoke-Command -ScriptBlock $sb
    }
    else {
        $params = $myinvocation.BoundParameters
        $params.Add("SSHTransport", $True)
        $params.Add("Scriptblock", $sb)
        $params.Add("HideComputername", $True)

        Invoke-Command @params | Select-Object -Property * -exclude RunspaceID
    }
    Write-Verbose "Ending $($myinvocation.MyCommand)"
}

此功能利用 PowerShell Core 中引入的远程更改,允许您通过 SSH 连接到远程计算机。如果计算机名称(即主机名)不是 localhost,则此命令使用基于 SSH 的 PowerShell 远程处理。附带说明一下,通常我更喜欢使用 $env:Computername 来反映本地计算机名称,但这在 Linux 上的 PowerShell 中不是一个选项,因此我求助于 .NET Framework。

以下是在 Ubuntu 实例上本地运行的命令。

[玩转系统] 适用于 Linux 的 PowerShell 脚本仍然与对象有关

下面是它在 Windows 系统上的 PowerShell 7 中的运行情况:

[玩转系统] 适用于 Linux 的 PowerShell 脚本仍然与对象有关

概括

我并不期望这个函数特别有用,并希望您更多地将其视为概念证明和展示跨平台工作时可能使用的一些脚本技术。您可以执行类似于 hostnamectl 命令输出的操作。

[玩转系统] 适用于 Linux 的 PowerShell 脚本仍然与对象有关

但我会把这个乐趣留给你。与此同时,尝试一下该函数。或许可以稍微加强一下。我很想听听您的跨平台脚本编写经验。

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

取消回复欢迎 发表评论:

关灯