Storicamente, gli strumenti da riga di comando nelle sistemi Unix sono stati sviluppati meglio che in Windows, tuttavia con l'introduzione di una nuova soluzione la situazione è cambiata.
Windows PowerShell consente agli amministratori di sistema di automatizzare la maggior parte delle attività di routine. Con essa è possibile modificare le impostazioni, fermare e avviare servizi, così come eseguire la manutenzione della maggior parte delle applicazioni installate. Considerare la finestra blu come un semplice interprete di comandi sarebbe fuorviante. Questo approccio non riflette la vera essenza delle innovazioni proposte da Microsoft. In realtà, le possibilità di Windows PowerShell sono molto più ampie: in una breve serie di articoli cercheremo di comprendere come la soluzione di Microsoft si differenzi dai nostri strumenti più familiari.
Funzionalità principali
Naturalmente, Windows PowerShell è prima di tutto una shell di comandi con un linguaggio di scripting, originariamente creata sulla base della piattaforma .NET Framework e successivamente su .NET Core. A differenza delle shell che accettano e restituiscono dati testuali, Windows PowerShell lavora con classi .NET che possiedono proprietà e metodi. PowerShell consente di eseguire comandi comuni e offre anche accesso a oggetti COM, WMI e ADSI. Utilizza vari archivi, come il file system o il registro di Windows, ai quali si accede tramite cosiddetti provider. È interessante notare la possibilità di incorporare componenti eseguibili di PowerShell in altre applicazioni per eseguire operazioni varie, anche tramite interfaccia grafica. Vale anche l'inverso: molte applicazioni per Windows forniscono accesso alle proprie interfacce di gestione tramite PowerShell.
Windows PowerShell consente:
- Modificare le impostazioni del sistema operativo;
- Gestire servizi e processi;
- Configurare ruoli e componenti del server;
- Installare software;
- Gestire il software installato tramite interfacce speciali;
- Incorporare componenti eseguibili in programmi di terze parti;
- Creare script per l'automazione dei compiti di amministrazione;
- Lavorare con il file system, il registro di Windows, il portafoglio dei certificati, ecc.
Interfaccia a riga di comando e ambiente di sviluppo
Esistono due versioni di Windows PowerShell: oltre all'emulatore della console con interfaccia a riga di comando, c'è un ambiente di scripting integrato (Integrated Scripting Environment - ISE). Per accedere all'interfaccia a riga di comando, basta selezionare l'apposito collegamento nel menu di Windows o avviare powershell.exe dal menu Esegui. Sullo schermo apparirà una finestra blu, che si distingue notevolmente per le possibilità rispetto al vetusto cmd.exe. Qui ci sono il completamento automatico e altre funzionalità familiari agli utenti delle shell di comando dei sistemi Unix.

Per lavorare con la shell, è necessario ricordare alcune combinazioni di tasti:
- Le frecce su e giù scorrono la cronologia per ripetere i comandi digitati in precedenza;
- La freccia a destra alla fine della riga reinserisce il comando precedente carattere per carattere;
- Ctrl+Home elimina il testo digitato dalla posizione del cursore all'inizio della riga;
- Ctrl+End elimina il testo dal cursore alla fine della riga.
F7 mostra una finestra con i comandi inseriti e consente di scegliere uno di essi. In console, è inoltre possibile selezionare il testo con il mouse, copiare e incollare, posizionare il cursore, eliminare e utilizzare il backspace — tutto come piace a noi.

Windows PowerShell ISE è un ambiente di sviluppo completo con un editor di codice che supporta le schede e l'evidenziazione della sintassi, un costruttore di comandi, un debugger integrato e altre meraviglie per programmatori. Se nel editor dell'ambiente di sviluppo scrivi un segno di meno dopo il nome del comando, otterrai nella lista a discesa tutte le opzioni disponibili indicate con il tipo. Puoi avviare PowerShell ISE tramite un collegamento nel menu di sistema o tramite il file eseguibile powershell_ise.exe.

Cmdlet
In Windows PowerShell sono stati introdotti i cosiddetti cmdlet. Queste sono classi specializzate di .NET che racchiudono una varietà di funzionalità. Sono chiamati seguendo il principio 'Azione-Oggetto' (o 'Verbo-Sostantivo', se preferisci), e la combinazione separata da un trattino ricorda il predicato e il soggetto nelle frasi delle lingue naturali. Ad esempio, Get-Help significa letteralmente 'Ottenere-Aiuto' o, nel contesto di PowerShell: 'Mostrare-Documentazione'. In sostanza, è l'equivalente del comando man nei sistemi Unix e i manuali in PowerShell devono essere richiesti in questo modo, e non invocando i cmdlet con il flag —help o /?.. Non dimenticare la documentazione online di PowerShell: quella fornita da Microsoft è abbastanza dettagliata.
Oltre a Get, nei cmdlet vengono utilizzati anche altri verbi (e non solo verbi, a dire il vero) per indicare azioni. Nella lista qui sotto presenteremo alcuni esempi:
Add — aggiungere;
Pulisci — pulire;
Enable — attivare;
Disable — disattivare;
Nuovo — creare;
Remove — eliminare;
Set — impostare;
Inizia — avviare;
Stop — fermare;
Esportazione — esportare;
Import — importare.
Ci sono cmdlet di sistema, cmdlet utente e cmdlet opzionali: come risultato dell'esecuzione, tutti restituiscono un oggetto o un array di oggetti. Non sono sensibili al maiuscolo e minuscolo, ovvero, dal punto di vista dell'interprete dei comandi, non c'è differenza tra Get-Help e get-help. Il simbolo ‘;’ viene utilizzato per la separazione, ma deve essere inserito solo se in una riga vengono eseguiti più cmdlet.
I cmdlet di Windows PowerShell sono raggruppati in moduli (NetTCPIP, Hyper-V, ecc.), e per cercare un oggetto e un'azione esiste il cmdlet Get-Command. Per mostrare la guida su di esso, si può fare così:
Get-Help Get-Command 
Per impostazione predefinita, il comando visualizza una guida breve, ma ai cmdlet possono essere passati parametri (argomenti) se necessario. Con questi è possibile, ad esempio, ottenere una guida dettagliata (parametro -Detailed) o completa (parametro -Full), così come mostrare esempi sullo schermo (parametro -Examples):
Get-Help Get-Command -ExamplesLa guida in Windows PowerShell viene aggiornata con il cmdlet Update-Help. Se la riga di comando diventa troppo lunga, è possibile continuare gli argomenti del cmdlet sulla riga successiva scrivendo il carattere di continuazione ‘`’ e premendo Invio; non è possibile semplicemente finire di scrivere il comando in una riga e continuare su un'altra.
Di seguito sono riportati alcuni esempi di cmdlet comuni:
Get-Process — mostra i processi attivi nel sistema;
Get-Service — mostra i servizi e il loro stato;
Get-Content — visualizza il contenuto di un file.
Per i cmdlet e le utility esterne più utilizzati, in Windows PowerShell ci sono sinonimi abbreviati — alias. Ad esempio, dir è un alias di Get-ChildItem. Nella lista degli alias ci sono anche i corrispondenti dei comandi delle sistemi Unix (ls, ps, ecc.), e il cmdlet Get-Help viene richiamato con il comando help. Puoi visualizzare l'elenco completo degli alias usando il cmdlet Get-Alias:

Script, funzioni, moduli e il linguaggio PowerShell
Gli script di Windows PowerShell sono memorizzati come normali file di testo con estensione .ps1. Non possono essere avviati con un doppio clic: è necessario fare clic con il tasto destro per aprire il menu contestuale e selezionare l'opzione "Esegui in PowerShell". Dalla console, è necessario indicare il percorso completo dello script oppure navigare nella directory corrispondente e digitare il nome del file. L'esecuzione degli script è inoltre limitata dalla politica di sistema, e per verificare le impostazioni correnti è possibile utilizzare il cmdlet Get-ExecutionPolicy, che restituirà uno dei seguenti valori:
Restricted — l'esecuzione degli script è vietata (impostazione predefinita);
AllSigned — è consentita solo l'esecuzione di script firmati da uno sviluppatore fidato;
RemoteSigned — è consentita l'esecuzione di script firmati e propri;
Unrestricted — è consentita l'esecuzione di qualsiasi script.
L'amministratore ha due opzioni. La più sicura prevede la firma degli script, ma è un processo piuttosto complesso; ci occuperemo di questo in articoli successivi. Ora seguiamo il percorso di minor resistenza e cambiamo la politica:
Set-ExecutionPolicy RemoteSigned 
PowerShell deve essere avviato come amministratore, anche se è possibile modificare la politica per l'utente corrente utilizzando un parametro specifico.
Gli script sono scritti in un linguaggio di programmazione orientato agli oggetti, le cui istruzioni seguono lo stesso principio delle cmdlet precedentemente esaminate: "Azione-Oggetto" ("Verbo-Sostantivo"). Il suo scopo principale è l'automazione delle attività di amministrazione, ma è un linguaggio interpretato completo, che include tutte le strutture necessarie: istruzioni condizionali, cicli, variabili, array, oggetti, gestione degli errori, ecc. È possibile utilizzare qualsiasi editor di testo per scrivere scenari, ma è più comodo utilizzare Windows PowerShell ISE.
Nello script è possibile passare parametri, renderli obbligatori e impostare valori predefiniti. Inoltre, Windows PowerShell consente di creare funzioni e di chiamarle proprio come i cmdlet: a tale scopo si utilizza la struttura Function e le parentesi graffe. Uno script con funzioni si chiama modulo e ha l'estensione .psm1. I moduli devono essere memorizzati nelle directory definite nelle variabili d'ambiente di PowerShell. È possibile visualizzarli utilizzando il seguente comando:
Get-ChildItem Env:PSModulePath | Format-Table -AutoSizePipeline
Nell'ultimo esempio abbiamo applicato una struttura ben nota agli utenti delle shell nei sistemi Unix. In Windows PowerShell, il pipe consente anche di passare l'output di un comando come input a un altro, ma nella realizzazione della pipeline c'è una differenza sostanziale: si tratta non solo di una serie di caratteri o di un testo. I cmdlet incorporati o le funzioni utente restituiscono oggetti o array di oggetti e possono anche riceverli come input. Come nella Bourne shell e nei suoi numerosi successori, in PowerShell, l'utilizzo della pipeline semplifica l'esecuzione di compiti complessi.
Il più semplice esempio di pipeline è il seguente:
Get-Service | Sort-Object -property Status 
Inizialmente viene eseguito il cmdlet Get-Service, e poi tutti i servizi ottenuti vengono passati al cmdlet Sort-Object per essere ordinati in base alla proprietà Status. L'argomento a cui viene passato il risultato della fase precedente dipende dal suo tipo — di solito è InputObject. Maggiori dettagli saranno trattati in un articolo dedicato al linguaggio di programmazione PowerShell.
Se desiderato, è possibile continuare la catena e passare il risultato di Sort-Object a un altro cmdlet (verranno eseguiti da sinistra a destra). A proposito, agli utenti Windows è disponibile anche la consueta struttura familiare per la visualizzazione pagina per pagina:
Get-Service | Sort-Object -property Status | moreEsecuzione di compiti in background
Spesso è necessario eseguire un comando in background, in modo da non dover attendere il risultato dell'esecuzione nella sessione della shell. In Windows PowerShell ci sono diversi cmdlet per questo scopo:
Start-Job — avvio di un'attività in background;
Stop-Job — arresto di un'attività in background;
Get-Job — visualizzazione dell'elenco delle attività in background;
Receive-Job — visualizzazione del risultato dell'attività in background;
Remove-Job — rimozione di un'attività in background;
Wait-Job — ripristino di un'attività in background nella console.
Per avviare un'attività in background utilizziamo il cmdlet Start-Job e specifichiamo il comando o il set di comandi tra parentesi graffe:
Start-Job {Get-Service} 
Puoi manipolare le attività in background in Windows PowerShell conoscendo i loro nomi. Iniziamo a imparare come visualizzarle:
Get-Job 
Ora mostriamo i risultati dell'attività Job1:
Receive-Job Job1 | more 
È tutto piuttosto semplice.
Esecuzione remota dei comandi
Windows PowerShell consente di eseguire comandi e script non solo su un computer locale, ma anche su un computer remoto e persino su un intero gruppo di macchine. Ci sono diversi modi per farlo:
- Molti cmdlet hanno il parametro
-ComputerName, ma in questo modo non è possibile, ad esempio, creare un pipeline; - Il cmdlet
Enter-PSSessionconsente di creare una sessione interattiva su una macchina remota; - Utilizzando il cmdlet
Invoke-Commandè possibile eseguire comandi o script su uno o più computer remoti.
Versioni di PowerShell
Dal suo primo rilascio nel 2006, PowerShell ha subito numerosi cambiamenti. Lo strumento è disponibile per una vasta gamma di sistemi operativi su diverse piattaforme hardware (x86, x86-64, Itanium, ARM): Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008/2008 R2, Windows 7, Windows 8, Windows 8.1, Windows RT, Windows RT 8.1, Windows Server 2012/2012 R2, Windows 10, Windows Server 2016, GNU/Linux e OS X. L'ultima versione, 6.2, è stata rilasciata il 10 gennaio 2018. Gli script scritti per versioni precedenti funzioneranno con alta probabilità su versioni successive, mentre il contrario può presentare problemi, poiché nel corso degli anni PowerShell ha introdotto un gran numero di nuovi cmdlet. Puoi scoprire la versione della shell di comandi installata sul computer utilizzando la proprietà PSVersion dell variabile integrata $PSVersionTable:
$PSVersionTable.PSVersion 
È possibile utilizzare anche il cmdlet:
Get-Variable -Name PSVersionTable –ValueOnly 
La stessa operazione può essere eseguita utilizzando il cmdlet Get-Host. In realtà, ci sono molte opzioni, ma per utilizzarle è necessario studiare il linguaggio di programmazione PowerShell, cosa di cui ci occuperemo nella .
Risultati
Microsoft è riuscita a creare una shell di comando davvero potente con un ambiente integrato per lo sviluppo di script. A differenza degli strumenti a cui siamo abituati nel mondo Unix, presenta una profonda integrazione con i sistemi operativi della famiglia Windows, così come con il software e la piattaforma .NET Core. PowerShell può essere definito una shell orientata agli oggetti, poiché i cmdlet e le funzioni personalizzate restituiscono oggetti o array di oggetti e possono riceverli in input. Riteniamo che questo strumento debba essere padroneggiato da tutti gli amministratori di server Windows: è passato il tempo in cui potevano fare a meno della linea di comando. Una console avanzata è particolarmente necessaria sui , ma questa è un'altra storia.
Solo gli utenti registrati possono partecipare al sondaggio. , per favore.
Quali argomenti dovremmo affrontare per primi nei prossimi articoli del ciclo?
53,2%Programmazione in PowerShell123
42,4%Funzioni e moduli PowerShell98
22,1%Come firmare i propri script?51
12,1%Lavorare con i repository tramite i fornitori (providers)28
57,6%Automatizzazione dell'amministrazione dei computer con PowerShell133
30,7%Gestione del software e integrazione dei componenti eseguibili PowerShell in prodotti di terzi71
Hanno votato 231 utenti. 37 utenti si sono astenuti.
Fonte: habr.com
