PowerShell è una shell interattiva e un linguaggio di scripting di Microsoft che ripensa su cosa sia una shell di comandi. Ha capacità molto interessanti al di sopra e al di là delle solite shell Unix, e c'è un forte ecosistema e comunità.
In questo tutorial in due parti, imparerai alcune delle cose interessanti che puoi fare con PowerShell, la sua storia, la sua architettura, i suoi concetti e il suo confronto con una shell Unix come Bash. Preparati per un viaggio eccitante!
Se sei su Windows 10, sei a posto. In caso contrario, scaricarlo dal sito Web di Microsoft.
Una volta installato PowerShell, la prima cosa da fare è abilitare l'esecuzione dello script. Avvia PowerShell come amministratore e digita: Set-ExecutionPolicy RemoteSigned
. Devi farlo solo una volta. Ora, aggiorna i file della guida: Aggiornamento-Aiuto-Forza
.
Iniziamo con una rapida dimostrazione dell'ampiezza e della profondità di PowerShell. Questa è solo una lista un po 'arbitraria per stuzzicare l'appetito. Non è completo, né queste sono necessariamente le cose più impressionanti che puoi fare con PowerShell.
Ecco un bel one-liner per riprodurre file video (o qualsiasi file multimediale):
(Nuovo oggetto -COM WMPlayer.OCX) .openPlayer ("Percorso del tuo video")
Si aprirà una finestra del lettore multimediale e inizierà a riprodurre immediatamente il video.
PowerShell ha una delle soluzioni più leggibili e visivamente gradevoli per le stringhe multi-linea, AKA "qui stringhe". Inizia con @"
e finisci con "@
. Si noti che i marcatori di inizio e di fine devono essere sulla propria linea, separati dal contenuto intermedio. Ecco un esempio:
$ x = "@ 123 456 789 @"
Scegli un numero casuale compreso tra 1 e 100:
1 ... 50 | Get-Random
Questa è una pipeline semplice. Il lato sinistro può generare tutti gli interi da 1 a 50 (inclusi), quindi viene inviato al cmdlet Get-Random che ne seleziona uno.
PowerShell supporta gli appunti in profondità. È possibile ottenere e impostare oggetti di diversi formati. Ovviamente, il testo semplice è possibile, ma puoi anche lavorare con immagini, HTML, RTF e persino file.
Qui, seleziono alcuni file in explorer e li ottengo dagli appunti in PowerShell:
23:43:05 C: \ Users \ the_g> Get-Clipboard - Modalità file LastWriteTime Lunghezza Nome ---- ------------- ------ ---- -a ---- 15/09/2016 11:41 PM 135890 Capture.PNG -a ---- 16/09/2016 10:09 PM 3179548 20160917_110605.jpg -a ---- 16/09/2016 10:09 PM 4623977 20160917_110734.jpg
Anche PowerShell può parlare!
Add-Type -AssemblyName System.speech $ synth = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer $ synth.Speak ("PowerShell per le persone")
Ecco una piccola pipeline per elencare tutte le macchine virtuali in esecuzione:
Get-VM | Where-Object $ _. Stato -eq "In esecuzione"
PowerShell può visualizzare una barra di avanzamento piacevole durante operazioni lunghe. Ecco un esempio che calcola ricorsivamente la dimensione totale di tutti i file nella directory corrente:
$ files = Get-ChildItem. -Recurse $ total = 0 For ($ i = 1; $ i -le $ files.Count-1; $ i ++) Write-Progress -Activity "Calcolo della dimensione totale ..." -status $ files [$ i] .Name - PercentComplete ($ i / $ files.Count * 100) $ total + = $ files [$ i] .Length Start-Sleep -Milliseconds 50 Write-Host "Dimensione totale: $ ($ total / 1MB)"
PowerShell 1.0 è stato rilasciato nel 2006, ma il suo inventore Jeffery Snover ha iniziato a lavorarci molto prima. Guarda il manifesto del 2002. PowerShell ha fatto molta strada. Windows era molto indietro in termini di servizi da riga di comando. Gli amministratori di sistema e gli utenti esperti hanno dovuto accontentarsi delle scarse offerte di cmd.exe e file batch. Ci sono stati alcuni deboli tentativi di migliorare le situazioni con gli host di script di Windows che consentivano agli oggetti di script di utilizzare VBScript o JScript, ma c'erano molti problemi con questo approccio.
PowerShell ha cambiato tutto questo e molto rapidamente. Non si limitava ad abbinare le capacità della linea di comando degli ambienti * nix, ma si muoveva rapidamente con molte innovazioni e una coerenza senza precedenti e facilità d'uso.
Oggi, PowerShell è alla versione 5.1. Lungo gli anni e le versioni, le funzionalità e gli ambienti di hosting di PowerShell sono cresciuti in modo significativo.
PowerShell 1.0 supporto dell'amministrazione locale di macchine Windows (incluso Windows Server 2003).
PowerShell 2.0 era integrato con Windows 7 e Windows Server 2008 R2. Ha aggiunto il supporto per il servizio remoto e aumentato significativamente le funzionalità di PowerShell con processi in background, transazioni, eventi, debug, un ambiente di sviluppo della GUI e molti nuovi cmdlet.
PowerShell 3.0 è stato rilasciato come parte del framework di gestione di Windows. È stato installato su Windows 8 e Windows Server 2012. Aggiunti lavori programmati, connettività di sessione, caricamento automatico dei moduli e molti nuovi comandi.
PowerShell 4.0 era integrato con Windows 8.1 e Windows Server 2012 R2. Ha aggiunto il supporto per la configurazione dello stato desiderata, il debug avanzato, la diagnostica di rete e il -PipelineVariable
interruttore.
PowerShell 5.0 è stato rilasciato come parte del framework di gestione di Windows 5. PowerShell 5.1 è stato rilasciato come parte degli aggiornamenti dell'anniversario di Windows 10. Le nuove funzionalità includono definizioni di classi PowerShell, enumerazioni .NET, debugging remoto e debug di processi in background, DSC local configuration manager e molti altri miglioramenti DSC.
PowerShell è un linguaggio di programmazione molto potente. Può eseguire script, ovviamente, ma ha anche meccanismi più avanzati come moduli, cmdlet personalizzati e classi. PowerShell è un linguaggio multi-paradigma che supporta i paradigmi orientati agli oggetti, funzionali e procedurali.
Ma forse l'aspetto più importante di PowerShell è che è un linguaggio .NET completo. Crea e utilizza oggetti di assembly .NET programmati in qualsiasi linguaggio e gli oggetti che passano attraverso la pipeline di PowerShell sono oggetti .NET. Anche PowerShell è fortemente digitato, ma quando è conveniente puoi ignorarlo e non devi specificare i tipi se non vuoi.
Per programmare proceduralmente, hai bisogno di funzioni, condizionali e loop. PowerShell ha tutto questo. Gli operatori di confronto potrebbero sorprenderti poiché non usano i simboli tipici. Invece hai: -eq
(pari), -lt
(meno di), -gt
(più grande di), -ge
(maggiore o uguale), ecc.
Ecco un esempio di logica condizionale che riceve input dall'utente e verifica che sia valido. Notare l'uso del -come
operatore per provare a convertire l'input in un numero intero. Se fallisce, il risultato è $ null
.
$ value = 44 $ in = Read-Host "Indovina un numero compreso tra 1 e 100" $ guess = $ in -as [int] if ((($ guess -eq $ null) -o ($ guess -lt 1)) -o ($ guess -gt 100)) Write-Host "$ guess non è un numero intero compreso tra 1 e 100" Exit if ($ guess -eq $ value) Write-Host "You Win!" elseif ($ guess -lt $ value) Write-Host "Troppo basso" else Write-Host "Troppo alto"
PowerShell ha molte strutture e cmdlet per lavorare con le raccolte e tagliarle e tagliarle a dadi, quindi i loop non sono spesso necessari. Ma, nel caso in cui tu sia così inclinato, ci sono un sacco di costrutti loopy in PowerShell. Puoi utilizzare i loop For, i loop ForEach, i loop While, i loop Do-While e persino i loop ForEach-Object speciali. Ecco alcuni esempi.
Per ($ i = 0; $ i -lt 100; $ i + = 20) $ i 0 20 40 60 80 $ list = 1 ... 5 ForEach ($ item in $ list) $ item * 3 3 6 9 12 15 $ in seguito = $ (Get-Date) .AddSeconds (5) while ($ (Get-Date) -lt $ dopo) "Ci siamo ancora?" sleep 1 PS C: \ WINDOWS \ system32> $ later = $ (Get-Date) .AddSeconds (5) while ($ (Get-Date) -lt $ dopo) "Ci siamo ancora?" sonno 1 Ci siamo ancora? Siamo arrivati? Siamo arrivati? Siamo arrivati? Siamo arrivati?
PowerShell è interamente dedicato alla programmazione funzionale. La pipeline è un ambiente di esecuzione funzionale in cui si compongono funzioni / cmdlet in modo dinamico. Puoi farlo in modo interattivo o puoi farlo in uno script. Se vuoi fare una programmazione funzionale esplicita, puoi farlo anche tu, ma la sintassi è un po 'macchinosa. Dai un'occhiata a questo articolo: Programmazione funzionale in PowerShell.
Hai già visto come utilizzare oggetti .NET e gli oggetti che passano attraverso la pipeline. Definiamo una classe in PowerShell e facciamo un OO di base. Creo qui una classe per un personaggio del gioco con salute e armatura che può subire danni e calcolare la sua salute. C'è anche un È vivo()
metodo che controlla se salute> 0. Uso un costruttore.
Si noti che è necessario creare un'istanza delle classi di PowerShell utilizzando [
. La sintassi New-Object non è supportata a partire da PowerShell 5.1.
class Character [string] $ Name [int] $ Health [int] $ AttackDamage [float] $ Armor Character ([stringa] $ nome, [int] $ salute, [int] $ attackDamage, [float] $ armatura) $ this.Name = $ nome $ this.Health = $ health $ this.AttackDamage = $ attackDamage $ this.Armor = $ armor [bool] IsAlive () return $ this.Health -gt 0 [void] TakeDamage ( [int] $ danno) if ($ this.armor -gt 0) $ damage = $ damage - 0.4 * $ this.Armor * $ damage $ this.Health - = $ damage $ c = [Carattere] :: new ("xxx", 50, 10, 1.0) $ c.TakeDamage (20) $ c.IsAlive () True $ c.Health 38 $ c.TakeDamage (40) $ c.Health 14 $ c.TakeDamage ( 40) $ c.Health -10 $ c.IsAlive () Falso
Puoi anche fare ereditarietà se vuoi, ma a questo punto dovresti probabilmente usare una lingua diversa.
PowerShell è dotato di un proprio IDE per lo sviluppo di script che include una finestra interattiva, multi-tabbed per gli script con il completamento del codice, una guida integrata su tutti i cmdlet e molto altro. È uno strumento molto lucido e ti consiglio di provarlo.
Ora hai visto le funzionalità di PowerShell come linguaggio di scripting e hai imparato un po 'i suoi obiettivi di design e la sua storia. Nella seconda parte tratterò in modo approfondito gli aspetti interattivi di PowerShell.