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
- Linux/macOS 配置文件路径位于
- 支持 Unix 上包含冒号的文件名称和文件夹名称。
- 支持具有逗号的脚本名称或完整路径。
- 检测何时使用 LiteralPath 参数禁止导航 cmdlet 的通配符扩展。
- 已更新
Get-ChildItem
,使之更类似于 *nixls -R
和 WindowsDIR /S
本机命令。Get-ChildItem
现在返回递归搜索期间遇到的符号链接,并且不会搜索这些链接指向的目录。
.PS1 文件扩展名
PowerShell 脚本必须以 .ps1
结尾,以便解释器了解如何在当前进程中加载并运行它们。 在当前进程中运行脚本是 PowerShell 的预期常见行为。 可以将 #!
魔法数字添加到没有 .ps1
扩展名的脚本中,但这会导致脚本在新的 PowerShell 实例中运行,进而导致脚本无法在交换对象时正确运行。 从 Bash 或其他 shell 执行 PowerShell 脚本时,可能需要此行为。
已删除便捷别名
在 Windows 上,为了方便用户,PowerShell 提供了一组映射到 Linux 命令名的别名。 在 Linux 和 macOS 上,移除了基本命令 ls
、cp
、mv
、rm
、cat
、man
、mount
和 ps
的“便捷别名”,以便本机可执行文件无需指定路径也能运行。
日志记录
在 macOS 上,PowerShell 使用本机 os_log
API 输出日志到 Apple 统一日志记录系统。
在 Linux 上,PowerShell 使用 Syslog 这种通用日志记录解决方案。
作业控制
在 Linux 或 macOS 上,PowerShell 中不支持 Unix 样式的作业控制。 fg
和 bg
命令不可用。 但可以使用在所有平台上工作的 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) 远程处理终结点。
sudo
、exec
和 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 和 macOSStop-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,但它仍处于早期开发阶段。