Condividi tramite


Differenze di PowerShell nelle piattaforme non Windows

PowerShell si impegna a fornire parità di funzionalità in tutte le piattaforme supportate. Tuttavia, alcune funzionalità si comportano in modo diverso o non sono disponibili a causa di differenze in .NET Core e differenze specifiche della piattaforma. Sono state apportate altre modifiche per migliorare l'interoperabilità di PowerShell in piattaforme non Windows.

.NET Framework e .NET Core

PowerShell in Linux e macOS usa .NET Core, un subset di .NET Framework completo in Microsoft Windows. Di conseguenza, gli script eseguiti in Windows potrebbero non essere eseguiti su piattaforme non Windows a causa delle differenze nei framework.

Per altre informazioni sulle modifiche in .NET Core, vedere Modifiche di rilievo per la migrazione da .NET Framework a .NET Core.

Modifiche generali all'interoperabilità unix

  • Aggiunta del supporto per il globbing dei comandi nativi nelle piattaforme Unix. Ciò significa che è possibile usare caratteri jolly con comandi nativi come ls *.txt.
  • La more funzionalità si attiene a Linux $PAGER e per impostazione predefinita utilizza less.
  • La barra rovesciata finale viene preceduta automaticamente da un carattere di escape quando si gestiscono argomenti di comando nativi.
  • Correzione di ConsoleHost per rispettare NoEcho le piattaforme Unix.
  • Non aggiungere PATHEXT una variabile di ambiente in Unix.
  • Nel pacchetto è inclusa una powershell pagina man.

Politica di esecuzione

PowerShell ignora i criteri di esecuzione durante l'esecuzione su piattaforme non Windows. Get-ExecutionPolicy restituisce Unrestricted su Linux e macOS. Set-ExecutionPolicy non esegue alcuna operazione in Linux e macOS.

Distinzione tra maiuscole e minuscole in PowerShell

Storicamente, PowerShell è stato uniformemente insensibile alle maiuscole, con poche eccezioni. Nei sistemi operativi simili a Unix, il file system fa prevalentemente distinzione tra maiuscole e minuscole e PowerShell rispetta lo standard del file system.

  • È necessario utilizzare le maiuscole e minuscole corrette quando si specifica un nome file in PowerShell.
  • Se uno script tenta di caricare un modulo e il nome del modulo non viene inserito correttamente, il caricamento del modulo non riesce. Questo comportamento potrebbe causare un problema con gli script esistenti se il nome a cui fa riferimento il modulo non corrisponde al caso corretto del nome file effettivo.
  • Mentre i nomi nel file system fanno distinzione tra maiuscole e minuscole, il completamento automatico tramite tab dei nomi file non fa distinzione tra maiuscole e minuscole. Il completamento tramite tabulazione permette di ciclare un elenco di nomi usando la corrispondenza senza distinzione tra maiuscole e minuscole.
  • Get-Help supporta criteri di ricerca senza distinzione tra maiuscole e minuscole nelle piattaforme Unix.
  • Import-Module non fa distinzione tra maiuscole e minuscole quando viene usato con un nome file per determinare il nome del modulo.

Supporto del file system per Linux e macOS

  • I percorsi assegnati ai cmdlet sono ora indipendenti dalla barra (entrambi / e \ funzionano come separatori di directory)
  • La specifica della directory di base XDG viene ora rispettata e usata per impostazione predefinita:
    • Il percorso del profilo Linux/macOS si trova in ~/.config/powershell/profile.ps1
    • Il percorso di salvataggio della cronologia si trova in ~/.local/share/powershell/PSReadLine/ConsoleHost_history.txt
    • Il percorso del modulo utente si trova in ~/.local/share/powershell/Modules
  • Supporto per i nomi di file e cartelle contenenti il carattere due punti in Unix.
  • Supporto per nomi di script o percorsi completi che contengono virgole.
  • Rilevare quando il parametro LiteralPath viene usato per eliminare l'espansione con caratteri jolly per i cmdlet di navigazione.
  • Aggiornato Get-ChildItem per funzionare più come i comandi nativi di *nix ls -R e di Windows DIR /S. Get-ChildItem restituisce ora i collegamenti simbolici rilevati durante una ricerca ricorsiva e non esegue ricerche nelle directory di destinazione di tali collegamenti.

Estensioni di file PS1

Gli script di PowerShell devono terminare .ps1 per consentire all'interprete di comprendere come caricarli ed eseguirli nel processo corrente. L'esecuzione di script nel processo corrente è il comportamento consueto previsto per PowerShell. È possibile aggiungere il #! numero magico a uno script che non dispone di un'estensione .ps1, ma in questo modo lo script viene eseguito in una nuova istanza di PowerShell, impedendo il corretto funzionamento dello script durante lo scambio di oggetti. Questo comportamento potrebbe essere utile quando si esegue uno script di PowerShell da Bash o da un'altra shell.

Alias pratici rimossi

PowerShell fornisce un insieme di alias su Windows che mappano ai nomi dei comandi Linux per comodità dell'utente. In Linux e macOS, gli "alias pratici" per i comandi lsdi base , catcprmmanmv, mount, , e ps sono stati rimossi per consentire l'esecuzione del file eseguibile nativo senza specificare un percorso.

Registrazione

In macOS PowerShell usa le API native os_log per accedere al sistema di registrazione unificato di Apple. In Linux PowerShell usa Syslog, una soluzione di registrazione universale.

Controllo processo

In PowerShell in Linux o macOS non è disponibile alcun supporto per il controllo dei processi in stile Unix. I fg comandi e bg non sono disponibili. Tuttavia, è possibile usare i processi di PowerShell che funzionano in tutte le piattaforme.

L'inserimento & alla fine di una pipeline determina l'esecuzione della pipeline come processo di PowerShell. Quando una pipeline è in background, viene restituito un oggetto processo. Quando la pipeline è in esecuzione come processo, tutti i *-Job cmdlet possono essere usati per gestire il processo. Le variabili (ignorando le variabili specifiche del processo) usate nella pipeline vengono copiate automaticamente nel processo in modo che Copy-Item $foo $bar & funzioni correttamente. Il processo viene eseguito nella directory corrente anziché nella home directory dell'utente.

Supporto per la comunicazione remota

La comunicazione remota di PowerShell (PSRP) con WinRM nelle piattaforme Unix richiede NTLM/Negotiate o Autenticazione di base su HTTPS. PSRP in macOS supporta solo l'autenticazione di base su HTTPS. L'autenticazione basata su Kerberos non è supportata.

PowerShell supporta la comunicazione remota di PowerShell (PSRP) su SSH in tutte le piattaforme (Windows, Linux e macOS). Per altre informazioni, vedere Comunicazione remota SSH in PowerShell.

Supporto just-Enough-Administration (JEA)

PowerShell su Linux o macOS non consente di creare endpoint di amministrazione vincolata (JEA).

sudo, exece PowerShell

Poiché PowerShell esegue la maggior parte dei comandi in memoria (ad esempio Python o Ruby), non è possibile usare sudo direttamente con powerShell predefiniti. È possibile eseguire pwsh da sudo. Se è necessario eseguire un cmdlet di PowerShell da PowerShell con sudo, ad esempio , sudo Set-Date 8/18/2016è necessario usare sudo pwsh Set-Date 8/18/2016.

Moduli inclusi nelle piattaforme non Windows

Per le piattaforme non Windows, PowerShell include i moduli seguenti:

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

Un numero elevato di comandi (cmdlet) comunemente disponibili in PowerShell non è disponibile in Linux o macOS. Spesso, questi comandi non si applicano a queste piattaforme. Ad esempio, i comandi per funzionalità specifiche di Windows, ad esempio il Registro di sistema o i servizi, non sono disponibili. Altri comandi, ad esempio Set-ExecutionPolicy, sono presenti ma non funzionali.

Per un elenco completo di moduli e cmdlet e delle piattaforme supportate, vedere Cronologia delle versioni di moduli e cmdlet.

I moduli non vengono più forniti con PowerShell

Per diversi motivi di compatibilità, i moduli seguenti non sono più inclusi in PowerShell.

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

I moduli specifici di Windows seguenti non sono inclusi in PowerShell per Linux o macOS.

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

Cmdlet non disponibili nelle piattaforme non Windows

Alcuni cmdlet sono stati rimossi da PowerShell. Altri utenti non sono disponibili o potrebbero funzionare in modo diverso nelle piattaforme non Windows. Per un elenco completo dei cmdlet rimossi da PowerShell, vedere Cmdlet rimossi da PowerShell.

Microsoft.PowerShell.Core

I cmdlet seguenti non sono disponibili in Linux o 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

Il parametro ShowWindow di Get-Help non è disponibile per le piattaforme non Windows. PowerShell 7.3 ha aggiunto il Switch-Process cmdlet e la exec funzione per Linux e macOS. Questi comandi non sono disponibili in Windows.

Cmdlet di Microsoft.PowerShell.Security

I cmdlet seguenti non sono disponibili in Linux o macOS:

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

Questi cmdlet sono disponibili solo a partire da PowerShell 7.1.

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

Microsoft.PowerShell.Management cmdlets

I cmdlet seguenti non sono disponibili in 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

I cmdlet seguenti sono disponibili con limitazioni:

  • Get-Clipboard - disponibile in PowerShell 7.0+
  • Set-Clipboard - disponibile in PowerShell 7.0+
  • Restart-Computer - disponibile per Linux e macOS in PowerShell 7.1+
  • Stop-Computer - disponibile per Linux e macOS in PowerShell 7.1+

Cmdlet di Microsoft.PowerShell.Utility

I cmdlet seguenti non sono disponibili in Linux e macOS:

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

Alias non disponibili in Linux o macOS

La tabella seguente elenca gli alias disponibili per Windows che non sono disponibili nelle piattaforme non Windows. Questi alias non sono disponibili perché l'alias è in conflitto con un comando nativo in tali piattaforme.

Nome alternativo Cmdlet (un piccolo script o comando in PowerShell)
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

La tabella non include alias non disponibili per i cmdlet che non esistono nelle piattaforme non Windows.

PowerShell Desired State Configuration (DSC)

A partire da PowerShell 7.2, il modulo PSDesiredStateConfiguration è stato rimosso da PowerShell ed è pubblicato in PowerShell Gallery. Per altre informazioni, vedere l'annuncio nel blog del team di PowerShell. Per altre informazioni sull'uso di DSC in Linux, vedere Introduzione a DSC per Linux. DSC v1.1 e v2.x non sono supportati in macOS. DSC v3 è supportato in Windows, Linux e macOS, ma è ancora in fase di sviluppo iniziale.