Il potere di PowerShell, parte 2

Nella prima parte, vi ho mostrato alcune cose interessanti che potete fare con PowerShell, coperto la storia di PowerShell ed esplorato in profondità le funzionalità di PowerShell come un linguaggio di scripting forte che supporta la programmazione procedurale, funzionale e orientata agli oggetti. 

Nella seconda parte, discuterò la shell interattiva, il profilo e il prompt e confronterò PowerShell con Bash.

PowerShell: la shell interattiva

PowerShell è stato progettato sin dall'inizio come una shell interattiva per amministratori di sistema Windows e utenti esperti. Si concentra su un piccolo numero di concetti, molto esperienza coerente e una pipeline di oggetti per concatenare e combinare comandi, filtrarli e formattarli. Il suo forte sistema di aiuto, che aderisce anche a un formato coerente, è un piacere da usare.

Vediamone un po 'in azione.

Ottenere aiuto

Il sistema di guida completo è accessibile attraverso Ottenere aiuto.

PS C: \ WINDOWS \ system32> Guida Invoke-WebRequest NAME Invoke-WebRequest SINOSSI Ottiene il contenuto da una pagina Web su Internet. SYNTAX Invoke-WebRequest [-Uri]  [-Corpo ] [-Certificare ] [-CertificateThumbprint ] [-Tipo di contenuto ] [-Credenziali ] [-DisableKeepAlive] [-Headers ] [-Infile ] [-MaximumRedirection ] [-Method Default | Get | Testa | Posta | Metti | Elimina | Traccia | Opzioni | Unisci | Patch] [-OutFile ] [-PassThru] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-SessionVariable ] [-TimeoutSec ] [-TransferEncoding Chunked | comprimere | sgonfiare | gzip | identity] [-UseBasicParsing] [-UseDefaultCredentials] [-UserAgent ] [-WebSession ] [] DESCRIZIONE Il cmdlet Invoke-WebRequest invia richieste HTTP, HTTPS, FTP e FILE a una pagina Web o un servizio Web. Analizza la risposta e restituisce raccolte di moduli, collegamenti, immagini e altri elementi HTML significativi. Questo cmdlet è stato introdotto in Windows PowerShell 3.0. LINK CORRELATI Versione online: http://go.microsoft.com/fwlink/?LinkId=821826 Invoke-RestMethod ConvertFrom-Json ConvertTo-Json NOTE Per vedere gli esempi, digitare: "get-help Invoke-WebRequest -examples". Per ulteriori informazioni, digitare: "get-help Invoke-WebRequest -detailed". Per informazioni tecniche, digitare: "get-help Invoke-WebRequest -full". Per la guida in linea, digitare: "get-help Invoke-WebRequest -online"

Per ottenere assistenza più dettagliata e vedere esempi, utilizzare gli interruttori appropriati: -esempi, -dettagli, o -pieno.

Se non sei sicuro del nome del comando, usa le parole chiave e PowerShell ti mostrerà tutti i comandi disponibili che contengono questa parola chiave. Vediamo quali cmdlet correlati a CSV sono disponibili:

PS C: \ Users \ the_g> Get-Help -Category Cmdlet csv | seleziona nome Nome ---- ConvertFrom-Csv ConvertTo-Csv Export-Csv Import-Csv 

Ho creato una piccola pipeline in cui ho limitato la chiamata Get-Help solo alla categoria Cmdlet e poi lo ho collegato alla "select" (alias per Select-Object) per ottenere solo la proprietà "name".

Lavorare con file e directory

Puoi fare praticamente tutto ciò che sei abituato: navigare in varie directory, elencare file e sottodirectory, esaminare il contenuto dei file, creare directory e file, ecc..

PS C: \ Users \ the_g> mkdir test_dir | selezionare nome Nome ---- test_dir PS C: \ Users \ the_g> cd. \ test_dir PS C: \ Users \ the_g \ test_dir> "123"> test.txt PS C: \ Users \ the_g \ test_dir> ls | nome Nome ---- test.txt PS C: \ Users \ the_g \ test_dir> get-content. \ test.txt 123

Lavorare con altri fornitori

Con PowerShell, puoi trattare molte cose come file system e navigarle usando CD e controllare il loro contenuto usando ls / dir. Ecco alcuni fornitori aggiuntivi:

Archivio dati del provider -------- ----- ---------- Alias ​​Alias: alias di Windows PowerShell Certificato Cert: certificati x509 per firme digitali Ambiente Env: variabili di ambiente Windows Funzione Funzione: Funzioni di Windows PowerShell Registro HKLM :, HKCU: variabile di registro di Windows Variabile: variabili di Windows PowerShell WSMan WSMan: informazioni di configurazione di WS-Management 

Controlliamo l'ambiente e vediamo quali variabili di ambiente relative a Go sono disponibili (sulla mia macchina):

PS C: \ Users \ the_g> ls env: GO * Nome Valore ---- ----- GOROOT C: \ GO \ GOPATH C: \ Users \ the_g \ Documents \ Go 

formattazione

PowerShell incoraggia la composizione di cmdlet con switch standard e la creazione di pipeline. La formattazione è un concetto esplicito in cui alla fine di una pipeline si inserisce un formattatore. PowerShell esamina di default il tipo di oggetto o di oggetto alla fine della pipe e applica un formattatore predefinito. Ma puoi sostituirlo specificando tu stesso un formattatore. I formattatori sono solo cmdlet. Ecco l'output precedente visualizzato in formato elenco:

PS C: \ Users \ the_g> ls env: GO * | Format-List Name: GOROOT Valore: C: \ Go \ Name: GOPATH Valore: c: \ Users \ the_g \ Documents \ Go 

Il profilo

Gli utenti esperti che utilizzano la riga di comando hanno spesso molte attività, pipeline e combinazioni di comandi preferite con opzioni predefinite che preferiscono. Il profilo PowerShell è un file di script PowerShell che viene caricato ed eseguito ogni volta che si avvia una nuova sessione. Puoi mettere lì tutte le tue chicche preferite, creare alias e funzioni, impostare variabili d'ambiente e praticamente tutto il resto.

Mi piace creare alias di navigazione in directory profondamente annidate, attivare ambienti virtuali Python e creare scorciatoie per comandi esterni che corro di frequente, come git e docker.

Per me, il profilo è indispensabile perché i comandi e gli switch coerenti e leggibili di PowerShell sono spesso troppo prolissi e gli alias predefiniti sono spesso più problemi di aiuto (ne discuto più avanti). Ecco uno snippet molto parziale dal mio profilo:

# --------------------------- # # DOCKER # # ----------------- ---------- Set-Alias ​​-Nome d -Valore funzione docker di d immagini # ------------------------ --- # # GIT # # --------------------------- Set-Alias ​​-Nome g -Valore git function gs g status function gpu g pull --rebase # ------------------------- # # CONDA # # ---------- --------------- funzione a activate.ps1 $ args [0] # ---------------------- - # # NAVIGATION # # ------------------------ function cdg cd $ github_dir # MVP function cdm a ov; cdg; cd MVP # funzione di backend cdb a ov; cdg; cd backend # scratch function cds a ov; cdg; cd scratch # pacchetti di backend function cdbp cdb; cd packages # Go workspace function cdgo cd $ go_src_dir

Il Prompt 

PowerShell consente di personalizzare il prompt dei comandi. È necessario definire una funzione chiamata richiesta(). È possibile visualizzare la funzione di prompt integrata:

PS C: \ Users \ the_g> funzione gc: prompt "PS $ ($ executionContext.SessionState.Path.CurrentLocation) $ ('>' * ($ nestedPromptLevel + 1))"; #. Link # http://go.microsoft.com/fwlink/?LinkID=225750 # .ExternalHelp System.Management.Automation.dll-help.xml PS C: \ Users \ the_g> 

Ecco una funzione di richiesta personalizzata che visualizza l'ora corrente oltre alla directory corrente:

PS C: \ Users \ the_g> prompt di funzione "$ (get-date) $ (get-location)>"

10/09/2016 12:42:36 C: \ Users \ the_g> 

Puoi scatenarti, naturalmente, aggiungere colori e verificare varie condizioni come se ti trovassi in un particolare repository git o se sei amministratore.

Alias: The Dark Side

PowerShell ha falsi alias, a mio parere, su due fronti distinti. Prima il alias comando consente solo la ridenominazione dei comandi. Non è possibile aggiungere flag o opzioni comuni per rendere i comandi più utili aliasandoli a se stessi.

Ad esempio, se si desidera cercare testo riga per riga, è possibile utilizzare il comando Select-String cmdlet:

# Crea un piccolo file di testo con 3 linee "@ ab cd ef @"> 1.txt # Cerca una riga contenente d Get-Content 1.txt | Seleziona-String d cd

Funziona, ma molte persone vorrebbero cambiare il nome Select-String a grep. Ma grep è di default case-sensitive, while Select-String non è. Nessun grosso problema: aggiungeremo semplicemente il -Che tiene conto del maiuscolo o minuscolo bandiera, come in:

Set-Alias ​​-Name grep -Value "Select-String -CaseSensitive" 

Sfortunatamente, questo non funziona:

16:19:26 C: \ Users \ the_g> Get-Content 1.txt | grep D grep: il termine "Select-String -CaseSensitive" non è riconosciuto come nome di un cmdlet, funzione, file di script o programma eseguibile. Controlla l'ortografia del nome o se è stato incluso un percorso, verifica che il percorso sia corretto e riprova. Alla riga: 1 carattere: 21 + Get-Content 1.txt | grep D + ~~~~ + CategoryInfo: ObjectNotFound: (Select-String -CaseSensitive: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException 

Il valore di un alias dovere può essere un cmdlet, una funzione, uno script o un programma. Non sono permessi flag o argomenti. 

Ora, puoi farlo facilmente con PowerShell, ma dovrai usare funzioni e non alias. Questo praticamente limita gli alias alla semplice ridenominazione, che può anche essere fatta per funzioni.

PowerShell vs. Bash

Dal lato della shell interattiva, PowerShell e Bash sono praticamente uguali. Bash è più conciso di default, ma la pipeline di oggetti di PowerShell rende le pipeline complicate più gestibili. ,

Detto questo, puoi probabilmente realizzare qualsiasi cosa con uno solo e se sei un utente esperto, avrai i tuoi alias, funzioni e scorciatoie per le attività più comuni. Dal punto di vista degli script, PowerShell va ben oltre Bash, e per scopi di amministrazione del sistema batte anche Python, Ruby e gli amici. 

Un aspetto importante è la disponibilità. Bash viene preinstallato con la maggior parte delle distribuzioni * nix (a meno che non siano specificamente rimosse) incluso macOS. Può anche essere installato su Windows tramite cygwin, git-bash o msys. PowerShell è preinstallato su Windows e recentemente è diventato disponibile su Mac e Linux.

Conclusione

Se si utilizza Windows come macchina di sviluppo o se si gestiscono macchine Windows, PowerShell è uno strumento indispensabile. È veramente un superset ben congegnato delle shell Unix e viene preinstallato. 

PowerShell è un'eccellente ingegneria del software al lavoro. Si è evoluto per oltre un decennio e ha continuato a innovare mantenendo la sua originale integrità concettuale. Il recente passaggio ai segnali open source e multipiattaforma ci lascia ancora molto da attendere.