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

[玩转系统] 非 Windows 平台上的 PowerShell 差异

作者:精品下载站 日期:2024-12-14 03:00:34 浏览:13 分类:玩电脑

非 Windows 平台上的 PowerShell 差异


PowerShell 致力于在所有支持的平台上提供相同的功能。但是,由于 .NET Core 和特定于平台的差异,某些功能的行为有所不同或不可用。还进行了其他更改以提高 PowerShell 在非 Windows 平台上的互操作性。

.NET Framework 与 .NET Core

Linux 和 macOS 上的 PowerShell 使用 .NET Core,它是 Microsoft Windows 上完整 .NET Framework 的子集。因此,由于框架的差异,在 Windows 上运行的脚本可能无法在非 Windows 平台上运行。

有关 .NET Core 中的更改的详细信息,请参阅从 .NET Framework 迁移到 .NET Core 的重大更改。

一般 Unix 互操作性更改

  • 添加了对 Unix 平台上本机命令通配符的支持。这意味着您可以在 ls *.txt 等本机命令中使用通配符。
  • more 功能遵循 Linux $PAGER 并默认为 less
  • 处理本机命令参数时,尾部反斜杠会自动转义。
  • 修复了 ConsoleHost 以在 Unix 平台上支持 NoEcho
  • 不要在 Unix 上添加 PATHEXT 环境变量。
  • 软件包中包含一个 powershell 手册页。

执行政策

在非 Windows 平台上运行时,PowerShell 会忽略执行策略。 Get-ExecutionPolicy 在 Linux 和 macOS 上返回 UnrestrictedSet-ExecutionPolicy 在 Linux 和 macOS 上不执行任何操作。

PowerShell 中的区分大小写

从历史上看,PowerShell 一直不区分大小写,只有少数例外。在类 UNIX 操作系统上,文件系统主要区分大小写,并且 PowerShell 遵循文件系统的标准。

  • 在 PowerShell 中指定文件名时,必须使用正确的大小写。
  • 如果脚本尝试加载模块并且模块名称大小写不正确,则模块加载会失败。如果模块引用的名称与实际文件名的正确大小写不匹配,则此行为可能会导致现有脚本出现问题。
  • 虽然文件系统中的名称区分大小写,但文件名的制表符补全不区分大小写。制表符补全使用不区分大小写的匹配在名称列表中循环。
  • Get-Help 支持 Unix 平台上不区分大小写的模式匹配。
  • Import-Module 与文件名一起使用来确定模块名称时不区分大小写。

Linux 和 macOS 的文件系统支持

  • 提供给 cmdlet 的路径现在与斜杠无关(/\ 都用作目录分隔符)
  • XDG 基本目录规范现在受到尊重并默认使用:

    • Linux/macOS 配置文件路径位于 ~/.config/powershell/profile.ps1
  • 历史记录保存路径位于~/.local/share/powershell/PSReadline/ConsoleHost_history.txt
  • 用户模块路径位于~/.local/share/powershell/Modules
  • 支持 Unix 上包含冒号字符的文件和文件夹名称。
  • 支持带有逗号的脚本名称或完整路径。
  • 检测何时使用 LiteralPath 参数来抑制导航 cmdlet 的通配符扩展。
  • 更新了 Get-ChildItem,使其工作方式更像 *nix ls -R 和 Windows DIR /S 本机命令。 Get-ChildItem 现在返回递归搜索期间遇到的符号链接,并且不搜索这些链接的目标目录。
  • .PS1 文件扩展名

    PowerShell 脚本必须以 .ps1 结尾,以便解释器了解如何在当前进程中加载和运行它们。在当前进程中运行脚本是 PowerShell 的预期常见行为。您可以将 #! 幻数添加到没有 .ps1 扩展名的脚本中,但这会导致脚本在新的 PowerShell 实例中运行,从而阻止交换对象时脚本无法正常工作。从 Bash 或其他 shell 执行 PowerShell 脚本时,可能需要这种行为。

    删除了方便的别名

    为了方便用户,PowerShell 在 Windows 上提供了一组映射到 Linux 命令名称的别名。在 Linux 和 macOS 上,基本命令 lscpmvrm 的“便捷别名” catmanmountps 已被删除,以允许本机可执行文件在不指定路径的情况下运行。

    记录

    在 macOS 上,PowerShell 使用本机 os_log API 记录到 Apple 的统一日志记录系统。在 Linux 上,PowerShell 使用 Syslog,这是一种无处不在的日志记录解决方案。

    作业控制

    Linux 或 macOS 上的 PowerShell 不支持 Unix 风格的作业控制。 fgbg 命令不可用。但是,您可以使用适用于所有平台的 PowerShell 作业。

    & 放在管道末尾会导致管道作为 PowerShell 作业运行。当管道后台运行时,会返回一个作业对象。一旦管道作为作业运行,所有 *-Job cmdlet 都可用于管理作业。管道中使用的变量(忽略特定于流程的变量)会自动复制到作业中,因此 Copy-Item $foo $bar & 可以正常工作。该作业在当前目录而不是用户的主目录中运行。

    远程支持

    在 Unix 平台上使用 WinRM 的 PowerShell 远程处理 (PSRP) 需要 NTLM/Negotiate 或基于 HTTPS 的基本身份验证。 macOS 上的 PSRP 仅支持通过 HTTPS 进行基本身份验证。不支持基于 Kerberos 的身份验证。

    PowerShell 在所有平台(Windows、Linux 和 macOS)上支持通过 SSH 的 PowerShell 远程处理 (PSRP)。有关详细信息,请参阅 PowerShell 中的 SSH 远程处理。

    充足管理 (JEA) 支持

    Linux 或 macOS 上的 PowerShell 不允许您创建约束管理 (JEA) 远程处理端点。

    sudoexec 和 PowerShell

    由于 PowerShell 在内存中运行大多数命令(例如 Python 或 Ruby),因此您无法直接将 sudo 与 PowerShell 内置命令一起使用。您可以从 sudo 运行 pwsh。如果需要使用 sudo 从 PowerShell 中运行 PowerShell cmdlet,例如 sudo Set-Date 8/18/2016,那么您可以使用 sudo pwsh设置日期 2016 年 8 月 18 日

    非 Windows 平台上包含的模块

    对于非 Windows 平台,PowerShell 包括以下模块:

    • Microsoft.PowerShell.Archive
    • Microsoft.PowerShell.Core
    • Microsoft.PowerShell.Host
    • Microsoft.PowerShell.Management
    • Microsoft.PowerShell.Security
    • Microsoft.PowerShell.Utility
    • PackageManagement
    • PowerShell获取
    • PS阅读线
    • ThreadJob

    PowerShell 中常用的大量命令 (cmdlet) 在 Linux 或 macOS 上不可用。通常,这些命令不适用于这些平台。例如,用于 Windows 特定功能(如注册表或服务)的命令不可用。其他命令(例如 Set-ExecutionPolicy)存在但不起作用。

    有关模块和 cmdlet 及其支持的平台的完整列表,请参阅模块和 cmdlet 的发布历史记录。

    PowerShell 不再附带模块

    出于各种兼容性原因,PowerShell 中不再包含以下模块。

    • 伊势
    • Microsoft.PowerShell.LocalAccounts
    • Microsoft.PowerShell.ODataUtils
    • Microsoft.PowerShell.Operation.Validation
    • PS预定作业
    • PS工作流程
    • PS工作流程实用程序

    适用于 Linux 或 macOS 的 PowerShell 中不包含以下特定于 Windows 的模块。

    • CimCmdlets
    • Microsoft.PowerShell.Diagnostics
    • Microsoft.WSMan.Management
    • PSD诊断

    Cmdlet 在非 Windows 平台上不可用

    一些 cmdlet 已从 PowerShell 中删除。其他功能在非 Windows 平台上不可用或可能以不同方式工作。有关从 PowerShell 中删除的 cmdlet 的完整列表,请参阅从 PowerShell 中删除的 Cmdlet。

    Microsoft.PowerShell.Core

    以下 cmdlet 在 Linux 或 macOS 上不可用:

      Disable-PSRemoting
      Enable-PSRemoting
      Connect-PSSession
      Disconnect-PSSession
      Receive-PSSession
      Get-PSSessionCapability
      Disable-PSSessionConfiguration
      Enable-PSSessionConfiguration
      Get-PSSessionConfiguration
      Register-PSSessionConfiguration
      Set-PSSessionConfiguration
      Unregister-PSSessionConfiguration
      Test-PSSessionConfigurationFile

      Get-HelpShowWindow 参数不适用于非 Windows 平台。 PowerShell 7.3 添加了适用于 Linux 和 macOS 的 Switch-Process cmdlet 和 exec 函数。这些命令在 Windows 上不可用。

      Microsoft.PowerShell.Security cmdlet

      以下 cmdlet 在 Linux 或 macOS 上不可用:

        Get-Acl
        Set-Acl
        Get-AuthenticodeSignature
        Set-AuthenticodeSignature
        New-FileCatalog
        Test-FileCatalog

        这些 cmdlet 仅从 PowerShell 7.1 开始可用。

          Get-CmsMessage
          Protect-CmsMessage
          Unprotect-CmsMessage

          Microsoft.PowerShell.管理 cmdlet

          以下 cmdlet 在 Linux 和 macOS 上不可用:

            Rename-Computer
            Get-ComputerInfo
            Get-HotFix
            Clear-RecycleBin
            Get-Service
            New-Service
            Remove-Service
            Restart-Service
            Resume-Service
            Set-Service
            Start-Service
            Stop-Service
            Suspend-Service
            Set-TimeZone

            以下 cmdlet 可用但有限制:

            • Get-Clipboard - 在 PowerShell 7.0+ 中可用
            • Set-Clipboard - 在 PowerShell 7.0+ 中可用
            • Restart-Computer - 适用于 PowerShell 7.1+ 中的 Linux 和 macOS
            • Stop-Computer - 适用于 PowerShell 7.1+ 中的 Linux 和 macOS

            Microsoft.PowerShell.Utility cmdlet

            以下 cmdlet 在 Linux 和 macOS 上不可用:

              Convert-String
              ConvertFrom-String
              ConvertFrom-SddlString
              Out-GridView
              Out-Printer
              Show-Command

              别名在 Linux 或 macOS 上不可用

              下表列出了可用于 Windows 但在非 Windows 平台上不可用的别名。这些别名不可用,因为别名与这些平台上的本机命令冲突。

              ac

              添加内容

              cat

              获取内容

              clear

              清除主机

              compare

              比较对象

              cp

              复制项目

              cpp

              复制项目属性

              diff

              比较对象

              kill

              停止进程

              ls

              获取子项

              man

              帮助

              mount

              新 PSDrive

              mv

              移动项目

              ps

              获取进程

              rm

              删除项目

              rmdir

              删除项目

              sleep

              开始-睡眠

              sort

              排序对象

              start

              启动进程

              tee

              Tee 对象

              write

              写输出

              该表不包含非 Windows 平台上不存在的 cmdlet 不可使用的别名。

              PowerShell 期望状态配置 (DSC)

              从 PowerShell 7.2 开始,PSDesiredStateConfiguration 模块已从 PowerShell 中删除,并在 PowerShell 库中发布。有关更多信息,请参阅 PowerShell 团队博客上的公告。有关在 Linux 上使用 DSC 的更多信息,请参阅适用于 Linux 的 DSC 入门。 macOS 不支持 DSC v1.1 和 v2.x。 DSC v3 在 Windows、Linux 和 macOS 上受支持,但仍处于早期开发阶段。

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

              取消回复欢迎 发表评论:

              关灯