Differenze di PowerShell nelle piattaforme non Windows

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

.NET Framework e .NET Core

PowerShell in Linux e macOS usa .NET Core, che è un subset di .NET Framework completo in Microsoft Windows. Di conseguenza, gli script eseguiti in Windows potrebbero non essere eseguiti in 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

  • Aggiunto il supporto per il glob dei comandi nativi nelle piattaforme Unix. Ciò significa che è possibile usare caratteri jolly con comandi nativi come ls *.txt.
  • La funzionalità more rispetta il $PAGER di Linux con valore predefinito less.
  • La barra rovesciata finale viene automaticamente preceduta da un carattere di escape quando si usano argomenti di comandi nativi.
  • Correzione di ConsoleHost per rispettare NoEcho sulle piattaforme Unix.
  • non aggiungere una PATHEXT variabile di ambiente in Unix
  • Nel pacchetto è inclusa una powershell pagina man

Criterio di esecuzione

Il -ExecutionPolicy parametro viene ignorato quando si esegue PowerShell in piattaforme non Windows. Get-ExecutionPolicy restituisce Unrestricted in Linux e macOS. Set-ExecutionPolicy non esegue alcuna operazione in Linux e macOS.

Distinzione tra maiuscole e minuscole in PowerShell

PowerShell non ha fatto storicamente distinzione tra maiuscole e minuscole in modo coerente e 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.

  • Quando si specifica un file in PowerShell, è necessario usare la corretta combinazione di maiuscole/minuscole.
  • Se uno script tenta di caricare un modulo e il nome del modulo non viene inserito correttamente, il caricamento del modulo non riesce. Ciò può causare un problema con gli script esistenti se il nome in base al quale viene fatto riferimento al modulo non corrisponde al caso corretto del nome file effettivo.
  • Mentre i nomi nel file system fanno distinzione tra maiuscole e minuscole, il completamento tramite tabulazione dei nomi file non fa distinzione tra maiuscole e minuscole. Il completamento tramite tabulazione scorre l'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 usa un nome file per determinare il nome del modulo.

Supporto del file system per Linux e macOS

  • I percorsi usati dai cmdlet sono ora indipendenti dalla barra (sia / che \ funzionano come separatore 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 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 i nomi di script o i percorsi completi con virgole.
  • Viene rilevato quando si usa -LiteralPath per eliminare l'espansione di caratteri jolly per i cmdlet di navigazione.
  • Get-ChildItem aggiornata per funzionare in modo più simile ai comandi nativi ls -R di *nix e DIR /S di Windows. 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 in .ps1 affinché l'interprete possa capire come caricarli ed eseguirli nel processo corrente. L'esecuzione di script nel processo corrente è il comportamento normale previsto per PowerShell. È possibile aggiungere il numero chiave #! a uno script senza estensione .ps1. In tal caso, tuttavia, lo script viene eseguito in una nuova istanza di PowerShell impedendo il corretto funzionamento dello script con oggetti interscambiabili. Questo può essere il comportamento auspicabile quando si esegue uno script di PowerShell da bash o un'altra shell.

Alias pratici rimossi

In Windows, PowerShell offre un set di alias corrispondenti a nomi di comandi di Linux per comodità degli utenti. In Linux e macOS, gli "alias pratici" per i comandi lsdi base , catcprmmanmv, mountsono ps stati rimossi per consentire l'esecuzione del file eseguibile nativo senza specificare un percorso.

Registrazione

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

Controllo dei processi

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. È possibile usare i processi di PowerShell che funzionano in tutte le piattaforme.

Il posizionamento di & alla fine di una pipeline causa l'esecuzione della pipeline come processo di PowerShell. Quando una pipeline è supportata da un 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 usate nella pipeline, ignorando quelle specifiche del processo, vengono copiate automaticamente nel processo in modo tale che Copy-Item $foo $bar & funzioni. Il processo viene inoltre eseguito nella directory corrente anziché nella home directory dell'utente.

Supporto della 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, macOS e Linux). Per altre informazioni, vedere Comunicazione remota SSH in PowerShell.

Supporto di JEA (Just Enough Administration)

La possibilità di creare endpoint remoti JEA (Constrained Administration) non è disponibile in PowerShell in Linux o macOS.

sudo, exec e 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 eseguire sudo pwsh Set-Date 8/18/2016.

Cmdlet mancanti

Un numero elevato di comandi (cmdlet) normalmente disponibili in PowerShell non è disponibile in Linux o macOS. In molti casi, questi comandi non sono significativi per queste piattaforme (ad esempio, funzionalità specifiche di Windows come il Registro di sistema). Sono presenti altri comandi come i comandi del controllo del servizio, ma non funzionali. Nelle versioni future questi problemi verranno risolti con la correzione dei cmdlet non funzionanti e con l'aggiunta di nuovi cmdlet.

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
  • PSScheduledJob
  • 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

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
  • PSDesiredStateConfiguration
  • PSReadLine
  • ThreadJob

Tuttavia, alcuni cmdlet sono stati rimossi da PowerShell e altri non sono disponibili o possono funzionare in modo diverso su piattaforme non Windows. Per un elenco completo dei cmdlet rimossi da PowerShell, vedere Cmdlet rimossi da PowerShell.

Microsoft.PowerShell.Core

Il parametro ShowWindow di Get-Help non è disponibile per le piattaforme non Windows.

Cmdlet 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

Cmdlet Microsoft.PowerShell.Management

I cmdlet seguenti non sono disponibili in Linux e macOS:

  • Clear-RecycleBin
  • Get-HotFix

I cmdlet seguenti sono disponibili con limitazioni:

Get-Clipboard - disponibile in Linux ma non supportato in macOS 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
  • 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é il cmdlet di destinazione non è disponibile o l'alias è in conflitto con un comando nativo in tali piattaforme.

Alias Cmdlet
ac Add-Content
cat Get-Content
clear Clear-Host
cnsn Connect-PSSession
compare Compare-Object
cp Copy-Item
cpp Copy-ItemProperty
diff Compare-Object
dnsn Disconnect-PSSession
gsv Get-Service
kill Stop-Process
ls Get-ChildItem
man help
mount New-PSDrive
mv Move-Item
ogv Out-GridView
ps Get-Process
rm Remove-Item
rmdir Remove-Item
sasv Start-Service
shcm Show-Command
sleep Start-Sleep
sort Sort-Object
spsv Stop-Service
start Start-Process
tee Tee-Object
write Write-Output

PowerShell Desired State Configuration (DSC)

Molti cmdlet sono stati rimossi dal modulo PSDesiredStateConfiguration a partire da PowerShell 6.0. Il supporto per DSC su piattaforme non Windows è limitato e per lo più sperimentale. Il Invoke-DscResource cmdlet è stato ripristinato come funzionalità sperimentale in PowerShell 7.0.

DSC non è supportato in macOS.

Per altre informazioni sull'uso di DSC in Linux, vedere Introduzione a DSC per Linux.

A partire da PowerShell 7.2, il modulo PSDesiredStateConfiguration è stato rimosso da PowerShell e viene pubblicato in PowerShell Gallery. Per altre informazioni, vedere l'annuncio nel blog del team di PowerShell.