Diventa professionista: la guida per utenti esperti di PowerShell

Se hai lottato con Windows 10, hai senza dubbio sentito parlare di PowerShell. Se di recente hai provato a fare qualcosa di stravagante con Win7 / 8.1, probabilmente è uscito anche PowerShell. Dopo anni passati a fare affidamento sulla riga di comando di Windows e file batch raggruppati, è ora di concentrarsi su qualcosa di più potente, più adattivo, migliore.

PowerShell è un'enorme aggiunta alla casella degli strumenti di Windows e può provocare un po 'di paura data l'enormità. È un linguaggio di scripting, una shell di comando, una cera per pavimenti? È necessario collegare un cmdlet con una classe .Net istanziata per eseguirlo con i provider? E perché tutti i documenti di supporto parlano di amministratori: devo essere un amministratore di Windows professionale per utilizzarlo?

Rilassare. PowerShell è potente, ma non deve essere intimidatorio.

La seguente guida è rivolta a coloro che hanno eseguito uno o due comandi di Windows o hanno jimmied un file batch. Considerala una trasformazione passo passo da PowerShell curioso a PowerShell capace.

Passaggio 1: alzalo

La prima cosa di cui avrai bisogno è PowerShell stesso. Se utilizzi Windows 10, hai già PowerShell 5, la versione più recente, installata. (Win10 Anniversary Update ha 5.1, ma non saprai la differenza con Fall Update 5.0.) Windows 8 e 8.1 vengono forniti con PowerShell 4, che è abbastanza buono per bagnarti i piedi. Installare PowerShell su Windows 7 non è difficile, ma richiede un'attenzione particolare e devi installare .Net Framework separatamente. JuanPablo Jofre spiega in dettaglio come installare WMF 5.0 (Windows Management Framework), che include PowerShell, oltre agli strumenti che probabilmente non utilizzerai all'avvio, su MSDN.

PowerShell offre due interfacce. Gli utenti avanzati sceglieranno la GUI completa, nota come Integrated Scripting Environment (ISE). I principianti, tuttavia, sono serviti al meglio dalla console di PowerShell, una semplice interfaccia di testo che ricorda la riga di comando di Windows o persino da DOS 3.2.

Per avviare PowerShell come amministratore da Windows 10, fare clic su Start e scorrere l'elenco delle app fino a Windows PowerShell. Fare clic su quella riga, fare clic con il pulsante destro del mouse su Windows PowerShell e scegliere Esegui come amministratore. In Windows 8.1, cerca Windows PowerShell nella cartella Sistema di Windows. In Win7, si trova nella cartella Accessori. È possibile eseguire PowerShell come un utente "normale" seguendo la stessa sequenza ma con un clic sinistro.

In qualsiasi versione di Windows, puoi utilizzare la ricerca di Windows per cercare PowerShell. In Windows 8.1 e Windows 10, è possibile inserirlo nel "Menu di alimentazione" Ctrl-X (fare clic con il pulsante destro del mouse su un punto vuoto sulla barra delle applicazioni e scegliere Proprietà; nella scheda Navigazione, selezionare la casella Sostituisci prompt dei comandi). Una volta aperto, è una buona idea aggiungere PowerShell alla barra delle applicazioni. Sì, ti piacerà così tanto.

Passaggio 2: digita i vecchi comandi di Windows

Saresti stupito di quanto la sintassi della riga di comando di Windows funzioni come previsto in PowerShell.

Ad esempio, cdcambia le directory (ovvero le cartelle) e dircontinua a elencare tutti i file e le cartelle inclusi nella cartella corrente.

A seconda di come si avvia la console di PowerShell, è possibile iniziare da c:\Windows\system32o da c:\Users\. Nell'esempio dello screenshot, utilizzo cd ..(nota lo spazio) per salire di un livello alla volta, quindi corro dirper elencare tutti i file e le sottocartelle nella C:\directory.

Passaggio 3: installa i file della guida

Comandi come cde dirnon sono comandi di PowerShell nativi. Sono alias, sostituti dei veri comandi di PowerShell. Gli alias possono essere utili per quelli di noi con la memoria del dito che è difficile da superare. Ma non iniziano nemmeno a toccare le parti più importanti di PowerShell.

Per iniziare ad avere un'idea di PowerShell stesso, digita helpseguito da un comando che conosci. Ad esempio, nello screenshot, digito help dir.

La guida di PowerShell mi dice che dirè un alias per il comando PowerShell Get-ChildItem. Abbastanza sicuro, se digiti get-childitemal PS C:\>prompt, vedi esattamente quello che hai visto con il dircomando.

Come notato nella parte inferiore dello screenshot, i file della guida per PowerShell non vengono installati automaticamente. Per recuperare loro (si fa desidera ottenere loro), accedere al PowerShell in modalità amministratore, quindi digitare update-help. L'installazione dei file della guida richiederà diversi minuti e potrebbero mancare alcuni moduli: l'installazione della Guida per NetWNV e SecureBoot non è riuscita sulla mia macchina di prova. Ma quando hai finito, il sistema completo di aiuto sarà a tua completa disposizione.

Da quel momento in poi, digita get-helpseguito dal comando ("cmdlet" in PowerShell speak, pronunciato "command-let") che ti riguarda e visualizza tutto l'aiuto per quell'elemento. Ad esempio, get-help get-childitemproduce un riepilogo delle get-childitemopzioni. Ti chiede anche di digitare variazioni sul tema. Pertanto, quanto segue:

get-help get-childitem -examples

produce sette esempi dettagliati di come utilizzare get-childitem. Il comando PowerShell

get-help get-childitem -detailed

include questi sette esempi, nonché una spiegazione dettagliata di ogni parametro disponibile per il get-childitemcmdlet.

Passaggio 4: ottenere assistenza sui parametri

Nello help dirscreenshot, potresti aver notato che ci sono due elenchi sotto SYNTAXper get-childitem. Il fatto che esistano due sintassi separate per il cmdlet significa che esistono due modi per eseguire il cmdlet. Come tenete separate le sintassi e cosa significano i parametri? La risposta è facile, se conosci il trucco.

Per ottenere tutti i dettagli sui parametri per il get-childitemcmdlet o qualsiasi altro cmdlet, utilizzare il -fullparametro, in questo modo:

get-help get-childitem -full

Ciò produce un elenco riga per riga di ciò che è possibile fare con il cmdlet e di ciò che può (o non può) accadere. Guarda lo screenshot.

Passando al setaccio i dettagli del parametro, è abbastanza facile vedere che get-childitempuò essere utilizzato per recuperare elementi "figlio" (come i nomi delle sottocartelle o dei nomi dei file) in una posizione specificata, con o senza corrispondenze di caratteri specifiche. Per esempio:

get-childItem “*.txt” -recurse

recupera un elenco di tutti i *.txtfile " " nella cartella corrente e di tutte le sottocartelle (a causa del -recurseparametro). Considerando quanto segue:

get-childitem “HKLM:\Software”

restituisce un elenco di tutte le chiavi di registro di alto livello in HKEY_LOCAL_MACHINE\Software.

Se hai mai provato ad entrare nel registro utilizzando una riga di comando di Windows o un file batch, sono sicuro che puoi vedere quanto deve essere potente questo tipo di accesso.

Passaggio 5: inchioda i nomi

C'è un motivo per cui i cmdlet che abbiamo visto fino ad ora hanno lo stesso aspetto: get-childitem, update-helpe get-helptutti seguono la stessa convenzione verbo-nome. Per fortuna, tutti i cmdlet di PowerShell usano questa convenzione, con un verbo che precede un nome (singolare). Quelli di voi che hanno passato settimane a lottare con comandi VB e VBA con nomi incoerenti possono tirare un sospiro di sollievo.

Per vedere dove stiamo andando, dai un'occhiata ad alcuni dei cmdlet più comuni (grazie al blog Hey, Scripting Guy! Di Ed Wilson!). Inizia con i cmdlet che raggiungono il tuo sistema ed estrai informazioni utili, come le seguenti:

  • set-location: Imposta la posizione di lavoro corrente su una posizione specificata
  • get-content: Ottiene il contenuto di un file
  • get-item: Ottiene file e cartelle
  • copy-item: Copia un elemento da una posizione a un'altra
  • remove-item: Elimina file e cartelle
  • get-process: Ottiene i processi in esecuzione su un computer locale o remoto
  • get-service: Ottiene i servizi in esecuzione su un computer locale o remoto
  • invoke-webrequest: Ottiene il contenuto da una pagina Web su Internet

Per vedere come funziona un particolare cmdlet, usa get-help, come in

get-help copy-item -full

In base alla descrizione della guida, è possibile capire immediatamente cosa vuole il cmdlet. Ad esempio, se desideri copiare tutti i tuoi file e cartelle da Documentsa c:\temp, dovresti utilizzare:

copy-item c:\users\[username] \documents\* c:\temp

Mentre digiti quel comando, vedrai alcuni bei tocchi integrati nell'ambiente di PowerShell. Ad esempio, se digiti copy-ie premi il tasto Tab, PowerShell compila Copy-Iteme uno spazio. Se digiti erroneamente un cmdlet e PowerShell non riesce a capirlo, ottieni una descrizione molto completa di cosa è andato storto.

Prova questo cmdlet. (Potrebbe tentare di farti installare un programma per leggere la casella "Informazioni su". In tal caso, ignoralo.)

invoke-webrequest askwoody.com

Si ottiene un elenco sintetico delle dichiarazioni di contenuto, delle intestazioni, delle immagini, dei collegamenti e altro della pagina Web. Vedi come funziona? Si noti get-helpnell'elenco invoke-webrequestche il invoke-webrequestcmdlet "restituisce raccolte di moduli, collegamenti, immagini e altri elementi HTML significativi", esattamente ciò che si dovrebbe vedere sullo schermo.

Alcuni cmdlet ti aiutano a controllare o raggruppare PowerShell stesso:

  • get-command: Elenca tutti i cmdlet disponibili (è un lungo elenco!)
  • get-verb: Elenca tutti i verbi disponibili (la metà sinistra dei cmdlet)
  • clear-host: Cancella la visualizzazione nel programma host

Vari parametri (ricordate get-help) vi permettono di ridurre i comandi e restringere le opzioni che potrebbero esservi utili. Ad esempio, per visualizzare un elenco di tutti i cmdlet che funzionano con i servizi Windows, prova questo:

get-command *-service

Elenca tutti i verbi disponibili con serviceil nome. Ecco il risultato:

Get-Service

New-Service

Restart-Service

Resume-Service

Set-Service

Start-Service

Stop-Service

Suspend-Service

È possibile combinare questi cmdlet con altri cmdlet per scavare in quasi tutte le parti di PowerShell. È qui che entrano in gioco i tubi.

Passaggio 6: portare i tubi

Se hai mai utilizzato la riga di comando di Windows o sei passato attraverso un file batch, conosci il reindirizzamento e le pipe. In termini semplici, sia il reindirizzamento (il  >carattere) che le pipe (il |carattere) prendono l'output di un'azione e lo attaccano da qualche altra parte. Puoi, ad esempio, reindirizzare l'output di un dircomando a un file di testo, o "reindirizzare" il risultato di un pingcomando in un find, per filtrare i risultati interessanti, in questo modo:

dir > temp.txt

ping askwoody.com | find “packets” > temp2.txt

Nel secondo comando sopra, il findcomando cerca la stringa packetsnell'output in pipe di un askwoody.com pinge inserisce tutte le righe che corrispondono in un file chiamato temp2.txt.

Forse sorprendentemente, il primo di quei comandi funziona bene in PowerShell. Per eseguire il secondo comando, vuoi qualcosa del genere:

ping askwoody.com | select-string packets | out-file temp2.txt

L'utilizzo di reindirizzamento e pipe espande notevolmente le capacità della riga di comando di Windows: invece di scorrere all'infinito verso il basso di una schermata alla ricerca di una stringa di testo, ad esempio, puoi mettere insieme un comando di Windows in pipe che esegue il controllo per te.

PowerShell ha una funzionalità di piping, ma non è limitato al testo. Invece, PowerShell consente di passare un intero oggetto da un cmdlet a quello successivo, dove un "oggetto" è una combinazione di dati (denominati proprietà) e di azioni (metodi) che possono essere utilizzati sui dati.

La parte difficile, tuttavia, sta nell'allineare gli oggetti. Il tipo di oggetto fornito da un cmdlet deve corrispondere ai tipi di oggetti accettati dal cmdlet ricevente. Il testo è un tipo di oggetto molto semplice, quindi se lavori con il testo, allineare gli elementi è facile. Altri oggetti non sono così rudimentali.

Come capirlo? Benvenuto nel get-membercmdlet. Se si desidera sapere quale tipo di oggetto produce un cmdlet, collegarlo tramite pipe get-member. Ad esempio, se stai cercando di capire i processi in esecuzione sul tuo computer e hai ristretto le opzioni al get-processcmdlet, ecco come scoprire cosa get-processproduce il cmdlet:

get-process | get-member

L'esecuzione di quel comando produce un lungo elenco di proprietà e metodi per get-process, ma all'inizio dell'elenco puoi vedere il tipo di oggetto che get-process crea:

TypeName: System.Diagnostics.Process

Il sotto screenshot si dice anche che get-processha proprietà chiamati Handles, Name, NPM, PM, SI, VM, e WS.

Se si desidera manipolare l'output di in get-processmodo da poter lavorare con esso (invece di visualizzare un lungo elenco di processi attivi sul monitor), è necessario trovare un altro cmdlet che funzioni System.Diagnostics.Processcome input. Per trovare un cmdlet disponibile, è sufficiente utilizzare ... attendere che ... PowerShell:

get-command -Parametertype System.Diagnostics.Process

Ciò produce un elenco di tutti i cmdlet che possono essere gestiti System.Diagnostics.Process.

Alcuni cmdlet sono noti per accettare quasi ogni tipo di input. Primo fra tutti: where-object. Forse in modo confuso, where-objectscorre ogni elemento inviato lungo la pipeline, uno per uno, e applica qualsiasi criterio di selezione richiesto. C'è un indicatore speciale chiamato $_. che ti consente di scorrere ogni elemento nel tubo, uno alla volta.

Supponiamo che tu voglia creare un elenco di tutti i processi in esecuzione sulla tua macchina che sono chiamati " svchost" - in PowerShell parlare, vuoi abbinare una Nameproprietà di  svchost. Prova questo comando di PowerShell:

get-process | where-object {$_.Name -eq “svchost”}

Il where-objectcmdlet esamina ogni System.Diagnostics.Processelemento, confronta il valore .Namedi tale elemento con " svchost"; se l'elemento corrisponde, viene sputato dall'estremità del tubo e digitato sul monitor. Guarda lo screenshot.