Dì Ciao a PowerShell

PowerShell è in sviluppo da oltre dieci anni. Microsoft continua a investire nel suo sviluppo e adozione. Questi investimenti hanno trasformato la facilità e la robustezza con cui sviluppatori e amministratori possono automatizzare le attività di Windows.


Cos'è PowerShell?

PowerShell risolve problemi di amministrazione e adattabilità integrando perfettamente .NET Framework.

PowerShell è il framework di automazione delle attività di Microsoft, costituito da una shell della riga di comando, un ambiente di scripting integrato (ISE), un linguaggio di scripting basato su .NET Framework, un'API che consente di ospitare PowerShell nelle applicazioni .NET ed è distribuito piattaforma di automazione. PowerShell fornisce accesso completo a COM e WMI, consentendo di eseguire attività su entrambi i sistemi Windows locali e remoti.

PowerShell è una nuova piattaforma di sviluppo per l'automazione, in quanto risolve le sfide di amministrazione e adattabilità integrando perfettamente .NET Framework. È utile per sviluppatori, amministratori, tester e altro. Basato su .NET, lo strumento riduce i costi, fornendo allo sviluppatore e agli amministratori un modo semplice e aziendale per automatizzare, misurare e migliorare tutti i loro processi.


Seguire insieme

In questa introduzione, evidenzierò parte della profondità e della larghezza che PowerShell offre al tavolo. Cose come il gioco che modifica la pipeline degli oggetti, il REPL (read, eval, print loop), l'integrazione con .NET e altro ancora.

Se si utilizza Windows 7 o 8, PowerShell è già installato. Scarica PowerShell v3 per Windows 7 qui. È necessario Windows 7 SP1 e il download funziona anche per Windows 2008 R2 SP1 e Windows 2008 SP2. Se stai usando Vista, XP o Windows 2003, dovrai accontentarti di PowerShell v2 qui.


Per cosa è buono? Assolutamente tutto!

Dalla distribuzione di più risorse ad Azure, alla gestione delle build del software per l'integrazione continua, all'accesso ai servizi Web o agli endpoint REST. PowerShell ha coperto e fornisce molto di più.

  • Taglia e taglia facilmente testo, XML, CSV e JSON
  • Incorpora PowerShell per fornire funzionalità di scripting per le tue app C #
  • Crea applicazioni GUI da cinque a dieci volte più velocemente con meno codice
  • Sfrutta le funzionalità di PowerShell per lavorare con Internet
  • Interagisci con le DLL e crea oggetti, visualizza automaticamente le proprietà e chiama i metodi nelle sessioni interattive live
  • Costruisci linguaggi specifici del dominio (DSL) e vocabolari per esprimere le soluzioni in modo più chiaro
  • Lavorare con Microsoft Office tramite COM (Component Object Model)
  • Funzionalità di PowerShell v3

PowerShell per il bootstrap

Cos'è un cmdlet? Un cmdlet è il blocco di base fondamentale in PowerShell ed è espresso come una coppia di verbo-nome, contribuendo a renderli autodescrittivi. Per esempio:

PS C: \> Get-Date Domenica 26 maggio 2013 8:46:16

PowerShell include centinaia di cmdlet core e puoi scrivere i tuoi.

Memorizza due Cmdlet

PowerShell rende facile la scoperta. Ogni volta che si sale alla schermata blu di PowerShell e non si è sicuri su cosa fare, utilizzare Get-Command.

Il Get-Command cmdlet ottiene tutti i comandi che sono installati sul computer, inclusi cmdlet, alias, funzioni, flussi di lavoro, filtri, script e applicazioni.

In sostanza, Get-Command mostra tutte le cose che puoi fare nella sessione corrente di PowerShell.

Get-Command

Get-Command supporta i caratteri jolly. Diciamo che voglio vedere tutti i cmdlet che hanno il verbo, Invocare?

Richiama l'ordine di richiamo *

Ecco cosa ricevo dopo aver premuto accedere.

CommandType Nome ModuleName ----------- ---- ---------- Funzione Invoke-AsWorkflow PSWorkflowUtility Funzione Invoke-Background Funzione ShowUI Invoke-BrowserControl Funzione AutoBrowse Invoke-Line isepack Funzione Richiamare -Line Funzione PowerShellPack Invoke-Office365 Funzione Pipeworks Invoke-Pester Pester Funzione Invoke-WebCommand Cmdlet di Pipeworks Invoke-CimMethod CimCmdlets Cmdlet Invoke-Command Microsoft.PowerShell.Core Cmdlet Invoke-Expression Microsoft.PowerShell.Utility Cmdlet Invoke-History Microsoft.PowerShell.Core Cmdlet Invoke-Item Microsoft.PowerShell.Management Cmdlet Invoke-RestMethod Microsoft.PowerShell.Utility Cmdlet Invoke-TroubleshootingPack Risoluzione dei problemi Cmdlet Invoke-WebRequest Microsoft.PowerShell.Utility Cmdlet Invoke-WmiMethod Microsoft.PowerShell.Management Cmdlet Invoke-WSManAction Microsoft.WSMan.Management

Quali sono i cmdlet che terminano con il nome dell'oggetto?

Get-Command * -Item

Nota che inizi a vedere altri verbi, come Cancella, Nuovo, Rimuovi e Imposta.

CommandType Nome ModuleName ----------- ---- ---------- Cmdlet Clear-Item Microsoft.PowerShell.Management Cmdlet Copy-Item Microsoft.PowerShell.Management Cmdlet Get-Item Microsoft.PowerShell.Management Cmdlet Invoke-Item Microsoft.PowerShell.Management Cmdlet Move-Item Microsoft.PowerShell.Management Cmdlet Nuovo elemento Microsoft.PowerShell.Management Cmdlet Remove-Item Microsoft.PowerShell.Management Cmdlet Rename-Item Microsoft.PowerShell.Management Cmdlet Set-Item Microsoft.PowerShell.Management

Successivamente userò alcuni cmdlet per riepilogare ciò che è disponibile nella mia sessione su una delle mie scatole quando lancio la console di PowerShell.

Get-Command | Gruppo CommandType -NoElement | Ordina numero -Descending

Chiamo Get-Command, raggruppalo e ordinalo. Qui, posso vedere che ho 1000+ cmdlet con cui lavorare. Sto eseguendo PowerShell v3 con moduli aggiuntivi installati, quindi il tuo chilometraggio può variare.

Conteggio Nome ----- ---- 2487 Funzione 1184 Cmdlet 38 Alias ​​1 Filtro

Da quali moduli provengono questi cmdlet? Possiamo rispondere a questa domanda in questo modo:

Get-Command -CommandType Cmdlet | Group ModuleName -NoElement | Ordina numero -Descending

Ci sono molte cose che posso ottenere con PowerShell.

Conteggio nome ----- ---- 379 ShowUI 164 Hyper-V 157 Azure 92 Microsoft.PowerShell.Utility 82 Microsoft.PowerShell.Management 78 WebAdministration 55 Microsoft.PowerShell.Core 22 Dism 18 Internazionale 17 PKI 16 PSScheduledJob 13 Microsoft. WSMan.Management 12 CimCmdlets 10 Microsoft.PowerShell.Security 9 TrustedPlatformModule 8 BitsTransfer 8 MsDtc 6 Pipeworks 6 Kds 5 AppLocker 5 SecureBoot 5 Microsoft.PowerShell.Diagnostics 4 NetSecurity 4 Appx 3 WindowsErrorReporting 2 Microsoft.PowerShell.Host 2 TroubleshootingPack 1 PSWorkflow 1 DnsClient

Ottenere aiuto

Ottenere aiuto fa esattamente questo, visualizza l'aiuto per il cmdlet sei di cosa sapere di più. Non solo è facile ottenere aiuto, è facile creare / includere aiuto per i cmdlet / funzioni avanzate che sviluppi, un argomento per un altro articolo. Avere aiuto a portata di mano è un enorme risparmio di tempo.

Get-Help Invoke-Command

Ecco una versione abbreviata dell'output.

NAME Get-Process SYNOPSIS Ottiene i processi in esecuzione sul computer locale o su un computer remoto. SINTASSI Get-Process [[-Nome] ] [-Nome del computer ] [-FileVersionInfo []] [-Modulo []] [] Get-Process [-ComputerName ] [-FileVersionInfo []] [-Modulo []] -Id  [] Get-Process [-ComputerName ] [-FileVersionInfo []] [-Modulo []] -InputObject  [] DESCRIZIONE Il cmdlet Get-Process acquisisce i processi su un computer locale o remoto ... 

Più facile ancora; c'è un interruttore per questo sul cmdlet Get-Help che ti porta qui.

Get-Help Get-Process -Online

Vuoi solo vedere esempi su come usare il cmdlet? Utilizzare il -Esempi interruttore. Inoltre, puoi copiare e incollare l'esempio direttamente nella console ed eseguirlo.

Get-Help Get-Process -Examples

È così facile e veloce.

NAME Get-Process SYNOPSIS Ottiene i processi in esecuzione sul computer locale o su un computer remoto. -------------------------- ESEMPIO 1 ---------------------- ---- PS C: \> Get-Process Questo comando ottiene un elenco di tutti i processi in esecuzione in esecuzione sul computer locale. Per una definizione di ciascuna colonna, consultare la sezione "Note aggiuntive" dell'argomento della Guida per Get-Help. -------------------------- ESEMPIO 2 ---------------------- ---- PS C: \> Get-Process winword, explorer | formato-lista *

PowerShell funziona facilmente con i servizi Web

Il W3C definisce un "servizio Web" come:

[...] un sistema software progettato per supportare l'interazione interoperabile macchina-macchina su una rete. Ha un'interfaccia descritta in un formato elaborabile dalla macchina (in particolare WSDL). Altri sistemi interagiscono con il servizio Web in un modo prescritto dalla sua descrizione utilizzando i messaggi SOAP, in genere trasmessi tramite HTTP con una serializzazione XML in combinazione con altri standard Web correlati.

PowerShell rende rapido il lavoro dei servizi Web, utilizzando il New-WebServiceProxy cmdlet. Cambiare il $ codice postale, eseguilo e ottieni le ultime informazioni meteo.

$ zipCode = "96826" $ svc = New-WebServiceProxy http://wsf.cdyne.com/WeatherWS/Weather.asmx $ result = $ svc.GetCityForecastByZIP ($ zipCode) # Trasforma i risultati $ result.ForecastResult | ForEach [PSCustomObject] @ City = $ result.City State = $ result.State Date = $ _. Date.ToString ("d") Descrizione = $ _. Desciption DaytimeHigh = $ _. Temperatures.DaytimeHigh

Risultato

Conservo l'oggetto proxy in $ svc e quindi chiama il GetCityForecastByZIP metodo, catturando i risultati in $ result. Facendo un loop attraverso l'array ForecastResult, trasformo il record sui dati. Si noti che il Città e DaytimeHigh sono a diversi livelli nella gerarchia.

La tecnica che sto usando è la creazione di coppie chiave / valore per la tabella hash. @ è la sintassi di PowerShell per un nuovo hashtable. utilizzando [PSCustomObject] è un PowerShell acceleratore, che mi consente, per prima cosa, di creare un oggetto personalizzato da una tabella hash.

Il Weather.asmx servizio web restituito XML gerarchico. In una manciata di comandi di PowerShell, ho riformattato i dati e formattato (la data) a mio piacimento. Per questo esempio, ho scelto di far stampare a PowerShell. Una volta ottenuti i dati nella sessione di PowerShell, ora sono connesso all'ecosistema PowerShell e posso facilmente collegare questa serie di oggetti personalizzati ad altri cmdlet per inviarlo a un altro servizio Web, generare HTML, salvarlo in un file, creare un CSV file o esportarlo in un database SQL.

Città Stato Data Descrizione Daytime High ---- ----- ---- ----------- ----------- Honolulu HI 22/05/2013 Showers 76 Honolulu HI 23/05/2013 Parzialmente nuvoloso 76 Honolulu HI 24/05/2013 Parzialmente nuvoloso 77 Honolulu HI 25/05/2013 Parzialmente nuvoloso 77 Honolulu HI 26/05/2013 Parzialmente nuvoloso 77 Honolulu HI 27/05/2013 Parzialmente nuvoloso 77 Honolulu HI 28/05/2013 Parzialmente nuvoloso 77

Lavorare con CSV, JSON e XML

Tagliare e tagliare a cubetti i formati di testo è un punto debole di PowerShell. Qui, convertirò tre formati comuni in un oggetto PowerShell. Per CSV e JSON, userò il corretto ConvertFrom- * cmdlet, e per XML, userò il acceleratore che accetta XML e crea un XMLDocument.

# Usa CSV $ csv = "Nome, Età'n'John, 10" | ConvertFrom-Csv $ csv Nome Età ---- --- John 10 # Usa JSON $ json = "Nome: 'Tom', Età: 20" | ConvertFrom-Json $ json Nome Age ---- --- Tom 20 # Usa XML $ xml = ([xml] [/ xml] "Harry30") .data.record $ xml Nome Age ---- --- Harry 30 # Combina tutti e tre $ csv, $ json, $ xml Nome Age ---- --- John 10 Tom 20 Harry 30 # Aggiungi il età $ csv, $ json, $ xml |% $ sum = 0 $ sum + = $ _. age $ sum 60

Quindi, abbiamo preso tre formati eterogenei e alla fine abbiamo eseguito un'aggregazione su uno dei campi. Avrei potuto recuperare ognuno di questi feed di dati da varie posizioni, il CSV da una condivisione di rete, il JSON per una query REST e l'XML da un servizio Web. Come ho detto, questo è un punto debole di PowerShell.


Ricerca Twitter

Usiamo la API REST di ricerca di Twitter nella riga di comando. Costruisco l'Url, che è possibile utilizzare nel browser, quindi utilizzo il cmdlet di PowerShell Invoke-RestMethod. Invia una richiesta al servizio REST e determina se la risposta è XML o JSON. Qui sto richiedendo una risposta JSON così, Invoke-RestMethod converte i risultati in una matrice di oggetti PowerShell. Li canalizzo al Selezionare cmdlet (un alias del verbo-sostantivo Select-Object) scegliendo solo tre campi. Pensa a questo come a una proiezione, simile a LINQ o SQL.

$ query = "PowerShell" $ url = "http://search.twitter.com/search.json?q=$query" (Invoke-RestMethod $ url) .results | Seleziona created_at, from_user_name, text

Risultato

È così facile Guarda un video che ho fatto per la versione 2: "PowerShell, ShowUI e l'API di Twitter". Una mini app Twitter WPF in manciata di PowerShell.

created_at from_user_name text ---------- -------------- ---- Sab, 25 maggio 2013 vitor pombeiro @brunomlopes a falar sobre Powershell "Ã minha maneira" Sab , 25 maggio 2013 Jeffery Hicks Lo sapevi che l'ISE #PowerShell ha opzioni di avvio? In Sat, 25 maggio 2013 Pat Richard @mwjcomputing Yeah - ha sempre utilizzato $ MyInvocation.MyCom Sat, 25 maggio 2013 Rob Fairman "#PowerShell Script per la cancellazione di #Windows Event Logs" ht Sab, 25 maggio 2013 Jim Priestley Automazione delle distribuzioni di SharePoint in Windows #Azure usin Sab, 25 maggio 2013 VT Technology RT @jangwoo_park: "@ VTTecnologia: Esporta multiple Virtua Sab, 25 maggio 2013 Aryan Nava Utilizzo di PowerShell per visualizzare il sito creato il precedente da Sab, 25 maggio 2013 Aryan Nava PowerShell Suggerimenti per SQL Server http://t.co/lVW2AY5BYZ Sab, 25 maggio 2013 Private Cloud Tech Il viaggio verso il cloud privato Parte 3 - Infrastruc Sab, 25 maggio 2013 Dr Tom Shinder Il viaggio verso il cloud privato Parte 3 â € "Infrastruc Sat, 25 maggio 2013 Jacob Daniels RT @tech_faq: Windows Server Manager è basato su Windows Sat, 25 maggio 2013 CodeCruiser 10 Suggerimenti per SQL Server PowerShell Scripter http: // t.

Compilare C # al volo in PowerShell

PowerShell è un linguaggio interpretato. Quindi, ci sarà una penalità. Non è una preoccupazione importante, ma, a volte, avrai bisogno della velocità di un linguaggio compilato. PowerShell consente di compilare C # in tempo reale nella memoria della sessione di PowerShell, utilizzando il comando -TypeDefinition parametro sul Add-Type cmdlet. Notare la stringa here identificato dal @ "" @. Sono super utili quando si cita il testo. Ti incoraggio ad esplorare di più con Add-Type e le regole di quotazione di PowerShell.

Add-Type -TypeDefinition @ "public class TestInline public long Fibonacci (long n) long a = 0; long b = 1; for (long idx = 0; idx < n; idx+=1)  long temp = a; a = b; b = temp + b;  return a;   "@ $obj = New-Object TestInline 1… 10 | ForEach  $obj.Fibonacci($_) 

Interagire con DLL

Ora, diciamo che non ti ho dato il codice sorgente - solo la DLL compilata. Nessun problema: Add-Type ha un -Sentiero parametro.

Aggiungi-Tipo -Path. \ FibLib.dll $ obj = New-Object TestInline 1 ... 10 | ForEach $ obj.Fibonacci ($ _)

Presta particolare attenzione a questo. utilizzando Add-Type in questo modo puoi facilmente racchiudere qualsiasi DLL .NET proveniente da chiunque, se non hanno già fornito un'interfaccia PowerShell. Questo è vero se la DLL proviene da Microsoft, DELL, Citrix o un altro sviluppatore.


In chiusura

Così lo fa per ora. Vorresti vedere più contenuti specifici di Powershell su Nettuts +? Facci sapere di seguito!