Partilhar via


Diferenças do PowerShell em plataformas não pertencentes ao Windows

O PowerShell se esforça para fornecer paridade de recursos em todas as plataformas suportadas. No entanto, alguns recursos se comportam de forma diferente ou não estão disponíveis devido a diferenças no .NET Core e diferenças específicas da plataforma. Outras alterações foram feitas para melhorar a interoperabilidade do PowerShell em plataformas que não sejam Windows.

.NET Framework vs .NET Core

O PowerShell no Linux e macOS usa o .NET Core, um subconjunto do .NET Framework completo no Microsoft Windows. Como resultado, os scripts executados no Windows podem não ser executados em plataformas que não sejam do Windows devido às diferenças nas estruturas.

Para obter mais informações sobre alterações no .NET Core, consulte Alterações recentes para migração do .NET Framework para o .NET Core.

Mudanças gerais de interoperabilidade Unix

  • Adicionado suporte para o globbing de comandos nativos em plataformas Unix. Isso significa que tu podes usar coringas com comandos nativos como ls *.txt.
  • A funcionalidade more respeita o $PAGER Linux e assume como padrão less.
  • A barra invertida à direita é automaticamente escapada ao lidar com argumentos de comando nativos.
  • Fixed ConsoleHost para homenagear NoEcho em plataformas Unix.
  • Não adicione PATHEXT variável de ambiente no Unix.
  • Uma página de manual powershell está incluída no pacote.

Política de execução

O PowerShell ignora as políticas de execução quando executado em plataformas que não são do Windows. Get-ExecutionPolicy retorna irrestrito no Linux e macOS. Set-ExecutionPolicy não faz nada no Linux e macOS.

Diferenciação de maiúsculas e minúsculas no PowerShell

Historicamente, o PowerShell tem sido uniformemente insensível a diferenciação de maiúsculas e minúsculas, com poucas exceções. Em sistemas operacionais Unix-like, o sistema de arquivos é predominantemente sensível a maiúsculas e minúsculas, e o PowerShell adere ao padrão do sistema de arquivos.

  • Você deve usar as maiúsculas e minúsculas corretas quando um nome de arquivo for especificado no PowerShell.
  • Se um script tentar carregar um módulo e o nome do módulo não estiver inserido corretamente, o carregamento do módulo falhará. Esse comportamento pode causar um problema com scripts existentes se o nome referenciado pelo módulo não corresponder ao caso adequado do nome do arquivo real.
  • Embora os nomes no sistema de arquivos diferenciem maiúsculas de minúsculas, o preenchimento de nomes de arquivos por tabulação não diferencia maiúsculas de minúsculas. Ciclos de conclusão de tabulação pela lista de nomes usando correspondência que não diferencia maiúsculas de minúsculas.
  • Get-Help suporta correspondência de padrões sem distinção entre maiúsculas e minúsculas em plataformas Unix.
  • Import-Module não diferencia maiúsculas de minúsculas quando usado com um nome de arquivo para determinar o nome do módulo.

Suporte a sistemas de arquivos para Linux e macOS

  • Os caminhos dados aos cmdlets agora são independentes de barras (tanto / quanto \ funcionam como separadores de diretório)
  • XDG Base Directory Specification agora é respeitado e usado por padrão:
    • O caminho do perfil Linux/macOS está localizado em ~/.config/powershell/profile.ps1
    • O caminho de salvamento do histórico está localizado em ~/.local/share/powershell/PSReadLine/ConsoleHost_history.txt
    • O caminho do módulo do usuário está localizado em ~/.local/share/powershell/Modules
  • Suporte para nomes de ficheiros e pastas contendo o carácter de dois pontos no Unix.
  • Suporte para nomes de script ou caminhos completos com vírgulas.
  • Detecte quando o parâmetro LiteralPath é usado para suprimir a expansão de caracteres universais para cmdlets de navegação.
  • O Get-ChildItem foi atualizado para funcionar mais como o comando nativo ls -R do *nix e o comando nativo do Windows DIR /S. Get-ChildItem agora retorna os links simbólicos encontrados durante uma pesquisa recursiva e não pesquisa os diretórios direcionados por esses links.

Extensões de arquivo .PS1

Os scripts do PowerShell devem terminar em .ps1 para que o intérprete entenda como carregá-los e executá-los no processo atual. A execução de scripts no processo atual é o comportamento usual esperado para o PowerShell. Você pode adicionar o #! número mágico a um script que não tem uma extensão .ps1, mas isso faz com que o script seja executado em uma nova instância do PowerShell, impedindo que o script funcione corretamente ao trocar objetos. Esse comportamento pode ser desejável ao executar um script do PowerShell a partir do Bash ou de outro shell.

Aliases de conveniência removidos

O PowerShell fornece um conjunto de aliases no Windows que correspondem a nomes de comando do Linux para conveniência do usuário. No Linux e macOS, os "aliases de conveniência" para os comandos básicos ls, cp, mv, rm, cat, man, mounte ps foram removidos para permitir que o executável nativo seja executado sem especificar um caminho.

Registo

No macOS, o PowerShell usa as APIs de os_log nativas para fazer logon no sistema de log unificado da Apple. No Linux, o PowerShell usa Syslog, uma solução ubíqua de registo.

Controlo de Tarefas

Não há suporte a controle de trabalho no estilo Unix no PowerShell no Linux ou macOS. Os comandos fg e bg não estão disponíveis. No entanto, você pode usar tarefas do PowerShell que funcionam em todas as plataformas.

Colocar & no final de um pipeline faz com que o pipeline seja executado como um trabalho do PowerShell. Quando um pipeline é colocado em segundo plano, um objeto de tarefa é retornado. Quando o pipeline estiver a ser executado como uma tarefa, todos os cmdlets *-Job poderão ser usados para gerir a tarefa. As variáveis (ignorando variáveis específicas do processo) usadas no pipeline são copiadas automaticamente para o trabalho para que Copy-Item $foo $bar & funcione. O trabalho é executado no diretório atual em vez do diretório inicial do usuário.

Suporte a comunicação remota

PowerShell Remoting (PSRP) usando WinRM em plataformas Unix requer NTLM/Negotiate ou Basic Auth através de HTTPS. O PSRP no macOS suporta apenas autenticação básica sobre HTTPS. A autenticação baseada em Kerberos não é suportada.

O PowerShell oferece suporte à comunicação remota do PowerShell (PSRP) sobre SSH em todas as plataformas (Windows, Linux e macOS). Para obter mais informações, consulte SSH remoting no PowerShell.

Suporte Just-Enough-Administration (JEA)

O PowerShell em Linux ou macOS não permite a criação de pontos de extremidade de administração restrita (JEA) para acesso remoto.

sudo, exece PowerShell

Como o PowerShell executa a maioria dos comandos na memória (como Python ou Ruby), não se pode usar sudo diretamente com os comandos internos do PowerShell. Pode-se executar pwsh a partir de sudo. Se for necessário executar um cmdlet do PowerShell de dentro do PowerShell com sudo, por exemplo, sudo Set-Date 8/18/2016, você usaria sudo pwsh Set-Date 8/18/2016.

Módulos incluídos em plataformas não Windows

Para plataformas que não sejam Windows, o PowerShell inclui os seguintes módulos:

  • Microsoft.PowerShell.Arquivo
  • Microsoft.PowerShell.Core
  • Microsoft.PowerShell.Host
  • Microsoft.PowerShell.Management
  • Microsoft.PowerShell.Segurança
  • Microsoft.PowerShell.Utility
  • Gestão de Pacotes
  • PowerShellGet
  • PSReadLine
  • ThreadJob

Um grande número de comandos (cmdlets) normalmente disponíveis no PowerShell não está disponível no Linux ou macOS. Muitas vezes, esses comandos não se aplicam a essas plataformas. Por exemplo, comandos para recursos específicos do Windows, como o registro ou serviços, não estão disponíveis. Outros comandos, como Set-ExecutionPolicy, estão presentes, mas não funcionais.

Para obter uma lista abrangente dos módulos e cmdlets e das plataformas que eles suportam, consulte Histórico de lançamento de módulos e cmdlets.

Os módulos não são mais fornecidos com o PowerShell

Por vários motivos de compatibilidade, os módulos a seguir não estão mais incluídos no PowerShell.

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

Os seguintes módulos específicos do Windows não estão incluídos no PowerShell para Linux ou macOS.

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

Cmdlets não disponíveis em plataformas não-Windows

Alguns cmdlets foram removidos do PowerShell. Outros não estão disponíveis ou podem funcionar de forma diferente em plataformas que não sejam Windows. Para obter uma lista abrangente dos cmdlets removidos do PowerShell, consulte Cmdlets removidos do PowerShell.

Microsoft.PowerShell.Core

Os seguintes cmdlets não estão disponíveis no Linux ou 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

O parâmetro ShowWindow de Get-Help não está disponível para plataformas que não sejam Windows. O PowerShell 7.3 adicionou o cmdlet Switch-Process e a função exec para Linux e macOS. Estes comandos não estão disponíveis no Windows.

Cmdlets Microsoft.PowerShell.Security

Os seguintes cmdlets não estão disponíveis no Linux ou macOS:

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

Esses cmdlets só estão disponíveis a partir do PowerShell 7.1.

  • Get-CmsMessage
  • Protect-CmsMessage
  • Unprotect-CmsMessage

Cmdlets Microsoft.PowerShell.Management

Os seguintes cmdlets não estão disponíveis no Linux e 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

Os seguintes cmdlets estão disponíveis com limitações:

  • Get-Clipboard - disponível no PowerShell 7.0+
  • Set-Clipboard - disponível no PowerShell 7.0+
  • Restart-Computer - disponível para Linux e macOS no PowerShell 7.1+
  • Stop-Computer - disponível para Linux e macOS no PowerShell 7.1+

Cmdlets Microsoft.PowerShell.Utility

Os seguintes cmdlets não estão disponíveis no Linux e macOS:

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

Aliases não disponíveis no Linux ou macOS

A tabela a seguir lista os aliases disponíveis para Windows que não estão disponíveis em plataformas que não sejam Windows. Esses aliases não estão disponíveis porque o alias entra em conflito com um comando nativo nessas plataformas.

Nome alternativo 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

A tabela não inclui aliases indisponíveis para cmdlets que não existem em plataformas não-Windows.

Configuração de Estado Desejado (DSC) do PowerShell

A partir do PowerShell 7.2, o módulo PSDesiredStateConfiguration foi removido do PowerShell e é publicado na Galeria do PowerShell. Para obter mais informações, consulte o de anúncio de no blog da Equipe do PowerShell. Para obter mais informações sobre como usar o DSC no Linux, consulte Introdução ao DSC para Linux. DSC v1.1 e v2.x não são suportados no macOS. O DSC v3 é suportado no Windows, Linux e macOS, mas ainda está em desenvolvimento inicial.