Condividi tramite


Esecuzione di comandi nella shell

PowerShell è una shell della riga di comando e un linguaggio di scripting usato per l'automazione. Analogamente ad altre shell, ad esempio bash in Linux o nella shell dei comandi di Windows (cmd.exe), PowerShell consente di eseguire qualsiasi comando disponibile nel sistema, non solo i comandi di PowerShell.

Tipi di comandi

Per qualsiasi shell in qualsiasi sistema operativo sono disponibili tre tipi di comandi:

  • parole chiave del linguaggio shell fanno parte del linguaggio di scripting della shell.

    • Esempi di parole chiave bash includono: if, then, else, elife fi.
    • Esempi di parole chiave cmd.exe includono: dir, copy, move, ife echo.
    • Esempi di parole chiave di PowerShell includono: for, foreach, try, catche trap.

    Le parole chiave del linguaggio della shell possono essere usate solo nell'ambiente di runtime della shell. Non esiste alcun file eseguibile, esterno alla shell, che fornisce la funzionalità della parola chiave.

  • comandi nativi del sistema operativo sono file eseguibili installati nel sistema operativo. I file eseguibili possono essere eseguiti da qualsiasi shell della riga di comando, ad esempio PowerShell. Sono inclusi i file di script che potrebbero richiedere il corretto funzionamento di altre shell. Ad esempio, se si esegue uno script batch di Windows (file.cmd) in PowerShell, PowerShell esegue cmd.exe e passa il file batch per l'esecuzione.

  • comandi specifici dell'ambiente shell sono comandi definiti in file esterni che possono essere usati solo all'interno dell'ambiente di runtime della shell. Questi includono script e funzioni oppure possono essere moduli appositamente compilati che aggiungono comandi al runtime della shell. In PowerShell questi comandi sono noti come cmdlet (pronunciati "command-let").

Esecuzione di comandi nativi

Qualsiasi comando nativo può essere eseguito dalla riga di comando di PowerShell. In genere si esegue il comando esattamente come si farebbe in bash o cmd.exe. L'esempio seguente illustra l'esecuzione del comando grep in bash in Ubuntu Linux.

sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

Dopo aver avviato PowerShell in Ubuntu, è possibile eseguire lo stesso comando dalla riga di comando di PowerShell:

PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash

Passaggio di argomenti a comandi nativi

La maggior parte delle shell include funzionalità per l'uso di variabili, la valutazione delle espressioni e la gestione delle stringhe. Ma ogni shell esegue queste operazioni in modo diverso. In PowerShell tutti i parametri iniziano con un trattino (-) carattere. In cmd.exela maggior parte dei parametri usa un carattere barra (/). Altri strumenti da riga di comando potrebbero non avere un carattere speciale per i parametri.

Ogni shell ha il proprio modo di gestire e valutare le stringhe nella riga di comando. Quando si eseguono comandi nativi in PowerShell che prevedono che le stringhe vengano racchiuse tra virgolette in modo specifico, potrebbe essere necessario modificare il modo in cui si passano tali stringhe.

Per altre informazioni, vedere gli articoli seguenti:

PowerShell 7.2 ha introdotto una nuova funzionalità sperimentale PSNativeCommandArgumentPassing che ha migliorato la gestione dei comandi nativi. Per altre informazioni, vedere $PSNativeCommandArgumentPassing.

Gestione dell'output e degli errori

PowerShell include anche diversi flussi di output rispetto ad altre shell. Le shell bash e cmd.exe hanno stdout e stderr. PowerShell ha sei flussi di output. Per altre informazioni, vedere about_Redirection e about_Output_Streams.

In generale, l'output inviato a stdout da un comando nativo viene inviato al flusso Success in PowerShell. L'output inviato a stderr da un comando nativo, viene inviato al flusso Errore in PowerShell.

Quando un comando nativo ha un codice di uscita diverso da zero, $? è impostato su $false. Se il codice di uscita è zero, $? è impostato su $true.

Tuttavia, questa modifica è cambiata in PowerShell 7.2. I record di errore reindirizzati dai comandi nativi, ad esempio quando si usano operatori di reindirizzamento (2>&1), non vengono scritti nella variabile $Error di PowerShell e la variabile di preferenza $ErrorActionPreference non influisce sull'output reindirizzato.

Molti comandi nativi scrivono in stderr come flusso alternativo per informazioni aggiuntive. Questo comportamento può causare confusione in PowerShell quando si esaminano errori e le informazioni di output aggiuntive possono andare perse se $ErrorActionPreference è impostato su uno stato che disattiva l'output.

PowerShell 7.3 ha aggiunto una nuova funzionalità sperimentale PSNativeCommandErrorActionPreference che consente di controllare se l'output stderr viene considerato come un errore. Per altre informazioni, vedere $PSNativeCommandUseErrorActionPreference.

Esecuzione di comandi di PowerShell

Come indicato in precedenza, i comandi di PowerShell sono noti come cmdlet. I cmdlet vengono raccolti nei moduli di PowerShell che possono essere caricati su richiesta. I cmdlet possono essere scritti in qualsiasi linguaggio .NET compilato o usando il linguaggio di scripting di PowerShell stesso.

Comandi di PowerShell che eseguono altri comandi

L'operatore di chiamata di PowerShell (&) consente di eseguire comandi archiviati in variabili e rappresentati da stringhe o blocchi di script. È possibile usarlo per eseguire qualsiasi comando nativo o comando di PowerShell. Ciò è utile in uno script quando è necessario costruire dinamicamente i parametri della riga di comando per un comando nativo. Per altre informazioni, vedere l'operatore di chiamata .

Il cmdlet Start-Process può essere usato per eseguire comandi nativi, ma deve essere usato solo quando è necessario controllare la modalità di esecuzione del comando. Il cmdlet include parametri per supportare gli scenari seguenti:

  • Eseguire un comando usando credenziali diverse
  • Nascondere la finestra della console creata dal nuovo processo
  • Reindirizza i flussi stdin, stdout, e stderr di , e
  • Usare una directory di lavoro diversa per il comando

Nell'esempio seguente viene eseguito il comando nativo sort.exe con flussi di input e output reindirizzati.

$processOptions = @{
    FilePath = "sort.exe"
    RedirectStandardInput = "TestSort.txt"
    RedirectStandardOutput = "Sorted.txt"
    RedirectStandardError = "SortError.txt"
    UseNewEnvironment = $true
}
Start-Process @processOptions

Per altre informazioni, vedere Start-Process.

In Windows il cmdlet Invoke-Item esegue l'azione predefinita per l'elemento specificato. Ad esempio, esegue un file eseguibile o apre un file di documento usando l'applicazione associata al tipo di file di documento. L'azione predefinita dipende dal tipo di elemento e viene risolto dal provider di PowerShell che fornisce l'accesso all'elemento.

Nell'esempio seguente viene aperto il repository del codice sorgente di PowerShell nel Web browser predefinito.

Invoke-Item https://github.com/PowerShell/PowerShell

Per altre informazioni, vedere Invoke-Item.