非 Windows 平台上的 PowerShell 差异

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

.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 上返回“无限制”。 Set-ExecutionPolicy 在 Linux 和 macOS 上不执行任何操作。

PowerShell 中的区分大小写

PowerShell 一直以来均区分大小写,只有少数例外情况。 在类似于 UNIX 的操作系统上,文件系统基本上都区分大小写,并且 PowerShell 遵守文件系统的标准。

  • 在 PowerShell 中指定文件名时,必须使用正确的大小写。
  • 如果脚本尝试加载模块,而模块名称的大小写不正确,则模块加载失败。 如果模块引用的的名称与实际文件名的正确大小写不一致,可能会导致现有脚本出现问题。
  • 尽管文件系统中的名称是区分大小写的,但文件名称的 Tab 自动补全不区分大小写。 Tab 自动补全功能使用不区分大小写的匹配来轮询名称列表中的名称。
  • 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 脚本时,可能需要此行为。

已删除便捷别名

在 Windows 上,为了方便用户,PowerShell 提供了一组映射到 Linux 命令名的别名。 在 Linux 和 macOS 上,移除了基本命令 lscpmvrmcatmanmountps 的“便捷别名”,以便本机可执行文件无需指定路径也能运行。

日志记录

在 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) 时需要通过 HTTPS 进行 NTLM/协商或基本身份验证。 macOS 上的 PSRP 仅支持通过 HTTPS 进行基本身份验证。 不支持基于 Kerberos 的身份验证。

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

Just-Enough-Administration (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 Set-Date 8/18/2016

非 Windows 平台上包括的模块

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

  • Microsoft.PowerShell.Archive
  • Microsoft.PowerShell.Core
  • Microsoft.PowerShell.Host
  • Microsoft.PowerShell.Management
  • Microsoft.PowerShell.Security
  • Microsoft.PowerShell.Utility
  • PackageManagement
  • PowerShellGet
  • PSReadLine
  • ThreadJob

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

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

PowerShell 不再附带模块

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

  • ISE
  • Microsoft.PowerShell.LocalAccounts
  • Microsoft.PowerShell.ODataUtils
  • Microsoft.PowerShell.Operation.Validation
  • PSScheduledJob
  • PSWorkflow
  • PSWorkflowUtility

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

  • CimCmdlet
  • Microsoft.PowerShell.Diagnostics
  • Microsoft.WSMan.Management
  • PSDiagnostics

cmdlet 不可用于非 Windows 平台

从 PowerShell 中移除了一些 cmdlet。 其他 cmdlet 则不可用,或在非 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-Help 的 ShowWindow 参数不可用于非 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.Management 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 平台上不可用的别名。 这些别名不可用,因为它们与这些平台上的本机命令冲突。

Alias Cmdlet
ac Add-Content
cat Get-Content
clear Clear-Host
compare Compare-Object
cp Copy-Item
cpp Copy-ItemProperty
diff Compare-Object
kill Stop-Process
ls Get-ChildItem
man help
mount New-PSDrive
mv Move-Item
ps Get-Process
rm Remove-Item
rmdir Remove-Item
sleep Start-Sleep
sort Sort-Object
start Start-Process
tee Tee-Object
write Write-Output

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

PowerShell Desired State Configuration (DSC)

从 PowerShell 7.2 开始,从 PowerShell 中移除了 PSDesiredStateConfiguration 模块,并将其发布到 PowerShell 库。 有关详细信息,请参阅 PowerShell 团队博客的公告。 有关在 Linux 上使用 DSC 的详细信息,请参阅适用于 Linux 的 DSC 入门。 macOS 不支持 DSC v1.1 和 v2.x。 WINDOWS、Linux 和 macOS 支持 DSC v3,但它仍处于早期开发阶段。