Windows PowerShell: Corso intensivo script

Questo lungo approfondito su Windows PowerShell consentirà di approfondire le proprie conoscenze di questa potente tecnologia.

Don Jones

Più si sono abituarsi a Windows PowerShell e rendersi conto dei vantaggi.Con questa premessa, di mese questo sarà lungo.Si tratta di una panoramica di lampo di Windows PowerShell di script, comprese le procedure per la creazione di script con parametri.Tramite i prossimi mesi, mi concentrerò su argomenti specifici basate su questa base.

Se non viene utilizzato per l'esecuzione di comandi Windows PowerShell nella console, è possibile trovare questa troppo avanzata ma tenta comunque bolide.Si deve avere una conoscenza approfondita delle funzionalità di protezione Windows PowerShell.Si dovrebbe già decidere sui criteri di esecuzione e le impostazioni in uso.Se non conosci la differenza tra "RemoteSigned" e "AllSigned", e per questo motivo uno è migliore rispetto a altro, potrebbero non essere pronti per il seguente materiale.

È inoltre necessario sapere come eseguire gli script nella shell e dovrebbe ricordare che è sempre necessario fornire un percorso e il nome del file per eseguire uno script.Infine, è necessario conoscere la differenza tra l'esecuzione di uno script in Integrated Scripting Environment (ISE) e la console.In ISE, gli script eseguiti nell'ambito globale.Nella console della shell normale, gli script di ottenere il proprio ambito.Leggerò ambito, ma dovrebbe essere già un'idea di che cosa significa e cosa.

Se non sei istruttivo abbastanza veloce, dare un'occhiata al mio libro, "Di Windows PowerShell informazioni in un mese serate con" (Manning Publications, 2011) e il sito Web companion e vedere se tali risorse consentono di creare una migliore base.

Provare a seguire durante la lettura di questa colonna.Provare gli esempi.Se si digita (o copiare e incollare) gli esempi di script nell'ISE Windows PowerShell inizio alla riga 1, i numeri di riga corrisponderà con i numeri di riga nelle descrizioni.

File di Script Windows PowerShell

Un file di script di Windows PowerShell non è altro che un file di testo normale con un.Estensione del nome file ps1."1" Non si riferisce la versione di Windows PowerShell, ma piuttosto la versione del motore di linguaggio.Windows PowerShell versione 1 e 2 utilizzare engine versione 1.Ecco perché entrambe le versioni della shell vengono installate in una cartella della versione 1.0 in \Windows\System32\WindowsPowerShell.

Uno script di Windows PowerShell non è esattamente come un file batch della riga di comando e non esegue uno script è esattamente uguale esegue gli stessi comandi nella stessa sequenza.Ad esempio, aprire una finestra di console ed eseguire le operazioni descritte di seguito, premendo INVIO dopo ogni riga (ricordarsi non di digitare i numeri di riga):

Get-Service
Get-Process

Digitare le stesse linee esatte in un file di script o lo script ISE, riquadro di modifica ed eseguire lo script. Sarà possibile ottenere risultati di ricerca diversi. Ogni volta che si preme INVIO in Windows PowerShell, si avvia una nuova tubazione. Qualunque comandi digitato vengono eseguiti in tale singola tubazione. Alla fine della pipeline, Windows PowerShell converte il contenuto in una visualizzazione di testo. Quando si eseguono due comandi nella console di normale, hai fatto in due condutture distinte.

Windows PowerShell è stato in grado di costruire una visualizzazione univoca per ogni insieme di output. Quando viene immesso in uno script, tuttavia, entrambi i comandi eseguito nella stessa tubazione. Il Windows PowerShell sistema di formattazione non è una sofisticata sufficiente per costruire uguale univoco per due diversi insiemi di risultati di output. Provare a eseguirlo nella console:

Get-Service;Get-Process

Tali risultati dovrebbero essere lo stesso aveva quando è stato eseguito lo script contenente i due comandi. In questo caso, entrambi i comandi è stato eseguito in una singola tubazione. Come è accaduto quando è stato eseguito lo script.

Il risultato pratico di tutti è che uno script dovrebbe produrre un solo tipo di output. È una pessima idea, debitamente in gran parte le limitazioni del sistema di formattazione. Vi sono altre considerazioni. Non si desidera che uno script di dump di diversi tipi di operazioni nella pipeline nello stesso momento.

Incentrata sugli aspetti che come una regola per tutti gli elementi che verranno trattati. Uno script dovrebbe generare uno e uno solo, il tipo di output. L'unica eccezione è se si tratta di uno script utilizzato per le funzioni più come un repository. In tal caso, ogni funzione dovrebbe generare uno e uno solo, il tipo di output.

Variabili.

Le variabili può essere paragonato a una finestra. È possibile inserire uno o più elementi, anche diversi elementi, in questa casella. La casella ha un nome e in Windows PowerShell tale nome può includere quasi tutti gli elementi. "Var" può essere un nome di variabile, come can "{mio variabile}". Nel secondo esempio le parentesi graffe racchiudono un nome di variabile che contiene spazi, che è piuttosto difficoltosa. È buona norma, stick con i nomi delle variabili includere lettere, numeri e caratteri di sottolineatura.

Utilizzando il nome della variabile fa riferimento l'intera "finestra." Se si desidera fare riferimento al contenuto della casella, aggiungere un segno di dollaro: $ var. Spesso si vedrà le variabili Windows PowerShell precedute con il segno di dollaro, poiché il concetto dell'utilizzo di uno è per ottenere il contenuto. È importante ricordare, tuttavia, che il simbolo del dollaro non fa parte del nome della variabile. È semplicemente un cue point per indicare Windows PowerShell che si desidera che il contenuto, piuttosto che la casella stessa. Ad esempio:

$var = 'hello'
$number = 1
$numbers = 1,2,3,4,5,6,7,8,9

Tali esempi illustrano come inserire elementi in una variabile utilizzando l'operatore di assegnazione (=). Ultimo esempio consente di creare una matrice, poiché tutti gli elenchi separati da virgola di Windows PowerShell viene interpretato come una matrice o un insieme di elementi. Nel primo esempio viene assegnato un oggetto stringa, con i caratteri nella stringa racchiusi tra virgolette.

Non vi è uno degli aspetti di Windows PowerShell che può confondere diritti. Windows PowerShell non "riconoscere" qualsiasi significato che possono associare a un nome di variabile. Una variabile come nomecomputer $ non "indica" shell che la variabile conterrà un nome di computer.

Analogamente, i numeri di $ non "indicano" la shell che una variabile conterrà più di un numero. Se si utilizza un nome di variabile plurale, non interessa la shell. L'istruzione

$numbers = 1

è valido anche per la shell è

$numbers = 'fred.'

Quando una variabile contiene più valori, tuttavia, è possibile utilizzare una sintassi speciale per accedere a un unico di essi. È necessario utilizzare i numeri di $[0] come prima voce, numeri $[1] sono il secondo, i numeri di $-[1] sono l'ultimo, numeri $-[2] sono l'ultimo secondo e così via.

Virgolette

È buona norma utilizzare virgolette per delimitare una variabile, a meno che non si dispone di un motivo specifico per eseguire in caso contrario. Esistono tre istanze specifiche in cui si desidera utilizzare le virgolette doppie.

Il primo è quando è necessario inserire il contenuto di una variabile in una stringa. All'interno di virgolette doppie, Windows PowerShell cercherà di $ e presuppone che tutto ciò che segue il simbolo $, fino al primo carattere che non è valido in un nome di variabile è un nome di variabile. Il contenuto di tale variabile sostituirà il nome della variabile e il simbolo $:

$name = 'Don'
$prompt = "My name is $name"

Al prompt dei comandi $ ora conterrà "il mio nome è Don" perché $name verrà sostituito con il contenuto della variabile. Si tratta di un trucco ideale per l'unione di stringhe senza dover concatenarle.

All'interno di virgolette doppie, Windows PowerShell anche il carattere di escape, la ricerca apice inverso o maiuscola con accento grave e agire di conseguenza. Ecco un paio di esempi:

$debug = "`$computer contains $computer"
$head = "Column`tColumn`tColumn"

Nel primo esempio, il primo $ corso "escape." Che consente di rimuovere il significato speciale di una funzione di accesso variabile. Se il computer $ contenuti "SERVER", debug di $ conterrà quindi "computer $ contiene il SERVER".

Nel secondo esempio, ' T' rappresenta un carattere di tabulazione orizzontale, in modo Windows PowerShell inserirà una tabulazione tra ciascuna colonna. È possibile leggere informazioni su altri caratteri di escape speciali della shell about_escape_characters argomento della Guida.

Infine, è necessario utilizzare le virgolette doppie quando una stringa deve contenere virgolette singole:

$filter1 = "name='BITS'"
$computer = 'BITS'
$filter2 = "name='$computer'"

In questo esempio, la stringa letterale è nome = 'Bit'. Le virgolette doppie contengono l'intero paragrafo. Sia filter1 $ e $Filtro2 finiscono contenente esattamente la stessa cosa, ma $Filtro2 vi si ottiene utilizzando il trucco variabile sostituzione di virgolette doppie. Si noti che conta effettivamente solo il set più esterno delle offerte. Le virgolette singole all'interno della stringa non sono importanti per Windows PowerShell. Le virgolette singole sono caratteri letterali è sufficiente. Windows PowerShell non interpretati.

Le variabili e i membri dell'oggetto

Tutti gli elementi di Windows PowerShell è un oggetto. Anche una stringa semplice, ad esempio "nome" è un oggetto di tipo System. String. È possibile inviare qualsiasi oggetto a Get-Member per visualizzarne il nome del tipo (vale a dire il tipo di oggetto che è) come pure i suoi membri, che include le proprietà e metodi:

$var = 'Hello'
$var | Get-Member

Utilizzare un punto dopo un nome di variabile per indicare la shell, "non si desidera accedere all'intero oggetto all'interno di questa variabile. Si potrà accedere solo uno dei relativi metodi o proprietà." Al termine del periodo, fornire il nome della proprietà o metodo.

I nomi di metodo sono sempre seguiti da un insieme di parentesi. Alcuni metodi accettano gli argomenti di input e quelli Vai all'interno delle parentesi in un elenco separato da virgole. Altri metodi non richiedono alcun argomento e, pertanto, le parentesi sono vuote, ma non dimenticano le parentesi:

$svc = Get-Service
$svc[0].
name
$name = $svc[1].
name
$name.length
$name.ToUpper()

Si noti la riga due. Avvio accedendo al primo elemento nella variabile $svc. I mezzi di periodi, "non si desidera l'intero oggetto. Voglio una proprietà o metodo." Consente di accedere solo la proprietà name. Riga 5 viene illustrato come accedere a un metodo, fornendo il nome dopo un periodo, seguito da parentesi.

Poiché il periodo, significa che si desidera accedere a una proprietà o metodo, un periodo è in genere un carattere non valido all'interno di un nome di variabile. Ciò significa che riga nell'esempio riportato di seguito non funzionerà nel modo desiderato potrebbe essere:

$service = 'bits'
$name = "Service is $service.ToUpper()"
$upper = $name.ToUpper()
$name = "Service is $upper"

Nella riga due, $ il cui nome contiene "servizio è di bit.ToUpper ()" considerando che nella quarta riga $ il cui nome contiene "Servizio è il bit".

Parentesi

A prescindere dal loro utilizzo con i metodi degli oggetti, le parentesi anche agiscono come un indicatore dell'ordine di esecuzione per Windows PowerShell, esattamente come in algebra. In altre parole, le parentesi indicano la shell "esecuzione di questo primo". L'intera espressione tra parentesi è sostituito da tutto ciò produce l'espressione. Ecco un paio di mind-bending di esempi:

$name = (Get-Service)[0].
name
Get-Service -computerName (Get-Content names.txt)

Nella riga 1, $name conterrà il nome del primo servizio nel sistema. Leggendo questo richiede un po' di sforzo. Iniziare con l'espressione tra parentesi. Che è ciò che Windows PowerShell inizierà con anche. "Get-Service" si risolve in un insieme o matrice di servizi. [0] Consente di accedere al primo elemento in una matrice, in modo che sia il primo servizio. Poiché è seguito da un punto, sappiamo che ci stiamo l'accesso a una proprietà o un metodo di servizio, anziché l'oggetto intero servizio. Infine, abbiamo estrarre solo il nome del servizio.

Nella riga due, l'espressione tra parentesi legge il contenuto di un file di testo. Supponendo che il file contiene un nome di computer per riga, "Get-Content" "restituirà una matrice di nomi di computer. Quelli sono alimentati per il parametro "-computername" di "Get-Service". In questo caso, la shell può alimentare qualsiasi espressione tra parentesi che restituisce una matrice di stringhe per la
parametro di "-computername", perché il parametro è stato progettato per accettare le matrici di stringhe.

Ambito

L'ambito è un concetto di programmazione che agisce come un sistema di containerization. Ad esempio variabili, alias, PSDrive e altri elementi di Windows PowerShell è tutti memorizzati in un ambito. La shell gestisce una gerarchia di ambiti e dispone di un set di regole che determinano gli ambiti di interagire e condividere informazioni tra loro.

Il serbatoio stesso è un singolo ambito denominato ambito globale. Quando si esegue uno script, costruisce un nuovo ambito e lo script viene eseguito all'interno che. Qualsiasi elemento creato dallo script, ad esempio una nuova variabile, è memorizzato all'interno dell'ambito dello script. Non è accessibile dalla shell di primo livello.

Quando lo script al termine dell'esecuzione, l'ambito di applicazione viene scartato e qualsiasi elemento creato all'interno di tale ambito scomparirà. Ad esempio, creare uno script che contiene i seguenti (non dimenticare di non digitare i numeri di riga), e quindi eseguire lo script dalla finestra della console:

New-PSDrive -PSProvider FileSystem -Root C:\ -Name Sys
Dir SYS:

Dopo aver eseguito lo script, eseguire manualmente "Dir SYS:" e dovrebbe essere visualizzato un errore. La ragione è che il SYS: unità è stato creato nello script. Una volta che lo script è stato fatto, tutto ciò che creato è stato scartato. Il SYS: unità non esiste più. Non tutti gli aspetti della shell è l'ambito. Elementi quali i moduli vengono gestiti a livello globale in ogni momento. Uno script è in grado di caricare un modulo e il modulo rimarrà caricato al termine dello script.

Se un ambito tenta di accedere a un elemento che non è stato creato all'interno di tale ambito, Windows PowerShell è l'ambito di livello superiore successiva (l'ambito "padre"). Ecco perché il comando Dir lavorato alias in quanto lo script appena immesso. Sebbene Dir non esiste nell'ambito dello script, esisteva nell'ambito di livello superiore successiva: l'ambito globale. Un ambito è libero di creare un elemento che ha lo stesso nome di un elemento da un ambito di livello superiore, anche se. Ecco un altro script per provare:

Dir
New-Alias Dir Get-Alias
Dir

Che potrebbe avere un aspetto strana, ma la prima volta che è stata eseguita "Dir", non esisteva nell'ambito dello script. Utilizzato l'alias Dir di livello superiore. Tale alias punti a Get-ChildItem, in modo che visualizzato un elenco di directory familiare.

Quindi, lo script crea un nuovo alias denominato Dir. Questo fa riferimento all'Alias di Get. Che è ciò che è stata eseguita la seconda volta. Ciò non influisce l'alias Dir di primo livello. Provare a eseguire Dir nella shell dopo l'esecuzione di script precedente, e comunque si otterrà un elenco di directory.

Ambito può creare confusione in particolare quando si tratta di variabili. Come regola generale, un determinato ambito non consigliabile non accedere mai elementi fuori dell'ambito, in particolare le variabili. Non vi è una sintassi per l'operazione, ad esempio l'utilizzo di $global: var per accedere forzatamente la variabile $var dell'ambito globale, ma che è una pessima abitudine, tranne in circostanze molto specifiche.

Linguaggio di Scripting di Windows PowerShell

Windows PowerShell contiene un linguaggio di script molto semplificato delle parole chiave di meno di venti. Che è un linguaggio di programmazione completo, ad esempio VBScript, che contiene le parole chiave quasi 300 un forte contrasto.

La lingua di Windows PowerShell semplificato sebbene possa sembrare, è più che sufficiente per svolgere il lavoro. Leggerò relativo costrutti di script principale a questo punto, anche se è sempre possibile ottenere ulteriori informazioni su queste leggendo "su" argomento all'interno della shell appropriata. Ad esempio, about_switchcontains informazioni di Guida per il costrutto di Switch, mentre about_if della Guida in linea contiene informazioni su If costruire. Eseguire la Guida sulle * per un elenco di tutti "gli argomenti about".

Costrutto If

Questo è il costrutto decisionale principale Windows PowerShell. Nella sua forma completa, appaia simile al seguente:

If ($this -eq $that) {
  # commands
} elseif ($those -ne $them) {
  # commands
} elseif ($we -gt $they) {
  # commands
} else {
  # commands
}

La parola chiave "If" è una parte obbligatoria di questo costrutto. La seguente espressione tra parentesi che devono restituire True o False. Windows PowerShell interpreteranno sempre zero come FALSO e qualsiasi valore diverso da zero come True.

Windows PowerShell riconosce inoltre le variabili predefinite $True e False $ come che rappresenta i valori booleani. Se l'espressione tra parentesi funziona su True, verranno eseguito i comandi nel seguente set di parentesi graffe. Se l'espressione è False, non eseguono i comandi. Questo è tutto ciò che è necessario per una valida se costruire.

È possibile passare un po' ulteriormente, fornendo una o più sezioni "ElseIf". Questi lo stesso modo come se costruire di lavoro. Ottengono la propria espressione tra parentesi. Se è True, si eseguirà i comandi all'interno di parentesi graffe riportato di seguito. In caso contrario, essi non.

Può concludere con un blocco Else, che verrà eseguito se nessuno dei blocchi precedenti esecuzione. Verrà eseguito solo il blocco associato alla prima espressione True. Se, ad esempio, $ciò non è stato uguale a $, e $quelli non uguali $ verrebbe eseguito quindi i comandi sulla quarta riga e niente altro. Windows PowerShell non verrà anche valutare la seconda espressione elseif nella riga 5.

Il carattere # è un carattere di commento, rendendo Windows PowerShell essenzialmente ignorare qualsiasi da tale posizione fino a un ritorno a capo restituito. Si noti inoltre che la cura con cui sono stati formattati tali costrutti. Potrebbe inoltre essere visualizzato da questo motivo alcuni scelgono di formattazione simile al seguente:

Non è importante in cui è possibile inserire le parentesi graffe. Tuttavia, ciò che è importante è che siano coerenti nel posizionamento in modo che gli script sono più facili da leggere. È inoltre importante per far rientrare, per lo stesso livello, ogni riga all'interno di parentesi graffe.

Ad ISE di Windows PowerShell consente di utilizzare il tasto Tab per tale scopo e il valore predefinito è un trattino di quattro caratteri. Rientro del codice è consigliabile core. In caso contrario, sarà necessario un tempo difficile corrispondenti correttamente aprendo e chiudendo le parentesi graffe in lingue con alfabeti complessi. Inoltre, tutti gli altri bambini che Windows PowerShell renderà divertente di voi. Consideriamo questo script formattazione insolita:

function mine {
if ($this -eq $that){
get-service
}}

Che è molto più difficili da leggere, eseguire il debug, risoluzione dei problemi e gestire. Mentre lo spazio dopo la parentesi di chiusura non è necessario, rende lo script più facile da leggere. Il codice con rientro non è necessario, ma rende più facile da seguire lo script. Considerare questo:

function mine {
 if ($this -eq $that){
  get-service
 }
}

Inserire una parentesi graffa di chiusura solo su una riga di per sé non è richiesto dalla shell ma accordataci dall'occhio umano. Essere un formattatore chiaro e avrete meno problemi negli script.

Il mentre il costrutto

Si tratta di un costrutto di ciclo in Windows PowerShell. È progettato per ripetere un blocco di comandi fino a quando una condizione è True o fino a quando una condizione diventa True. Ecco l'utilizzo di base:

Do {
  # commands
} While ($this -eq $that)

In questa variante del costrutto, i comandi all'interno di parentesi graffe verranno sempre eseguito almeno una volta. While condizione non viene valutata solo dopo la prima esecuzione. È possibile spostare While, nel qual caso verranno eseguito solo i comandi se la condizione è True, in primo luogo:

While (Test-Path $path) {
  # commands
}

Nel secondo esempio di avviso non viene utilizzato un operatore di confronto, ad esempio - EQ. Ciò avviene perché il cmdlet Test-percorso accade per restituire True o False per cominciare. Non è necessario confrontare che su True o False in modo che l'espressione da utilizzare.

È necessario che l'espressione tra parentesi utilizzato con questi costrutti script semplicemente semplificare verso il basso per True o False. Se si sta utilizzando un comando, ad esempio il percorso del Test, che restituisce sempre True o False, che non sarà necessario. Come sempre, non vi è un argomento "informazioni su" la shell di altri modi per utilizzare questo costrutto.

Il costrutto ForEach

Questo costrutto è simile in operazione per il cmdlet ForEach-Object. Si differenzia solo nella relativa sintassi. Lo scopo di ForEach è una matrice (o un insieme, che in Windows PowerShell è quello di una matrice) e consente di enumerare gli oggetti nella matrice in modo che è possibile lavorare con uno alla volta:

$services = Get-Service
ForEach ($service in $services) {
  $service.Stop()
}

È facile per modesto overthink questo costrutto. Tenere presente che la parola inglese plurale "servizi" non significa che qualsiasi cosa per Windows PowerShell. Tale nome della variabile viene utilizzato per ricordare che noi contiene uno o più servizi. Solo perché è plurale non rende la shell si comportano in modo speciale.

La parola chiave "in" nella seconda riga fa parte della sintassi ForEach. Variabile $service è costituita da. Esso potuto essere $fred o $caffè e sarebbe hanno lavorato in è uguale a quella modalità.

Windows PowerShell verranno ripetuti i comandi del costrutto, ovvero quelle contenute all'interno delle parentesi graffe, ovvero una volta per ogni oggetto nella variabile seconda (servizi$). Ogni volta verrà accettano un singolo oggetto dalla seconda variabile (servizi$) e inserirlo nella prima variabile (servizio$).

All'interno di questo costrutto, utilizzare la prima variabile (servizio$) per lavorare con un singolo oggetto. Nella riga 3 indica il periodo di "non si desidera lavorare con l'intero oggetto, solo uno dei suoi membri, ovvero il metodo Stop."

Esistono volte quando l'utilizzo di ForEach è inevitabile e auspicabile. Tuttavia, se si dispone di un po' di programmazione o degli script di esperienza, talvolta può leap per l'utilizzo di ForEach quando non è l'approccio migliore. Nell'esempio precedente non è un buon motivo per l'utilizzo di ForEach. Questo sarebbe più semplice:

Get-Service | Stop-Service

Il punto è valutare l'utilizzo di ForEach. Assicurarsi che è l'unico modo per eseguire l'operazione a portata di mano. Di seguito sono alcuni casi in cui ForEach è probabilmente l'unico modo per accedere:

  • Quando è necessario eseguire un metodo contro una serie di oggetti e non esiste un cmdlet che esegue l'azione equivalente.
  • Quando si dispone di un insieme di oggetti ed è necessario eseguire diverse azioni consecutive contro ciascuno.
  • Quando si dispone di un'azione che può essere eseguita solo su un oggetto alla volta, ma lo script potrebbe funzionare con uno o più oggetti e si è in alcun modo di sapere in anticipo.

Altri costrutti

Windows PowerShell dispone di diversi altri costrutti scripting, compresi Switch, per e così via. Questi sono tutti documentati in "Guida in linea all'interno della shell about". In alcuni casi, è possibile utilizzare i costrutti qui trattati per sostituire gli altri costrutti. Ad esempio, è possibile sostituire Switch con un costrutto che utilizza più sezioni ElseIf. È possibile sostituire per con ForEach o anche con il cmdlet ForEach-Object. Ad esempio, con un ciclo che viene eseguita esattamente 10 volte:

1..10 | ForEach-Object -process {
  # code here will repeat 10 times
  # use $_ to access the current iteration
  # number
}

Spetta all'utente di selezionare il costrutto migliore per svolgere il lavoro. Se si sta navigando Internet per gli script, essere pronto per l'esecuzione attraverso tutte le variazioni.

Funzioni

Una funzione è un tipo speciale di costrutto utilizzato per contenere un gruppo di comandi correlati che consentono di eseguire una singola attività specifiche. In genere, è possibile eseguire qualsiasi script Windows PowerShell e "capo" all'interno di una funzione:

function Mine {
  Get-Service
  Get-Process
}
Mine

Definisce una nuova funzione denominata "Miei". Che fondamentalmente Trasforma miniera in un comando, ovvero che è possibile eseguire la funzione semplicemente immettendo il relativo nome. Che è ciò che è di cinque di riga. Viene eseguita la funzione.

Le funzioni in genere sono contenute all'interno di un file di script. Un singolo script può contenere più funzioni. Le funzioni possono stessi contengono anche altre funzioni.

Tuttavia, le funzioni sono gli elementi con ambiti. Ciò significa che è possibile utilizzare solo una funzione all'interno dello stesso ambito in cui è stato creato. Se si inserisce una funzione in uno script e quindi eseguire lo script, la funzione è disponibile solo all'interno dello script e solo per la durata dello script. Quando lo script al termine dell'esecuzione, la funzione, ovvero tutti gli altri elementi, ad esempio nell'ambito dello script, ovvero sparisce. Di seguito è riportato un esempio:

function One {
  function Two {
Dir
  }
  Two
}
One
Two

Si supponga di inserire un solo file di script e di eseguire lo script. Riga sette viene eseguita la funzione di uno, a partire dalla riga di uno. Riga 5 viene eseguita una funzione denominata due, a partire dalla riga di due. In modo che il risultato sarà un elenco di directory che si trova sulla riga tre all'interno della funzione due.

Tuttavia, la riga successiva da eseguire sarà riga otto e che verrà generato un errore. Lo script non contiene una funzione denominata due. Funzione due è nascosto all'interno della funzione di uno. Ne consegue che esiste all'interno della funzione di un ambito. Solo altri elementi all'interno della funzione di una possono vedere due. Se si tenta di chiamare due da altro luogo, verrà visualizzato un errore.

Aggiunta di parametri a uno Script

È raro che per creare uno script che è destinato a esattamente la stessa operazione ogni volta che viene eseguito. Più frequentemente, è possibile script che contengono un tipo di dati della variabile o il comportamento di variabile. È possibile utilizzare queste variazioni con parametri.

I parametri sono definiti in modo speciale nella parte superiore dello script. Può essere preceduto da questa definizione con i commenti, ma in caso contrario deve essere il prima righe eseguibili di codice all'interno dello script. All'interno dell'area di definizione del parametro, ogni parametro è separato dal successivo da una virgola. In linea con l'idea di formattazione chiaro, è utile per inserire ogni parametro in una riga a sé stante. Di seguito è riportato un esempio:

param (
  [string]$computername,
  [string]$logfile,
  [int]$attemptcount = 5
)

In questo esempio definisce tre parametri. All'interno di script, questi vengono semplicemente utilizzati come qualsiasi altra variabile. Si noterà che nella quarta riga, per il parametro attemptcount $ assegnato un valore predefinito. L'impostazione predefinita verrà sostituita da un parametro di input, ma se lo script viene eseguito senza tale parametro viene specificato, verrà utilizzata.

Di seguito sono diversi modi in cui lo script potrebbe essere eseguito, supponendo che salvato come Test.ps1:

./test -computername SERVER
./test -comp SERVER -log err.txt -attempt 2
./test SERVER err.txt 2
./test SERVER 2
./test -log err.txt -attempt 2 -comp SERVER

Lo script accetta parametri molto simile a tutti i cmdlet. I nomi delle variabili vengono utilizzati come nomi di parametro specificati con il consueto trattino che precede di tutti i nomi di parametro in Windows PowerShell. Ecco una spiegazione della modalità di funzionamento:

  • Nella riga di uno, sto solo specificando uno dei parametri, ovvero$ logfile sarà vuota e $attemptcount conterrà 5, all'impostazione predefinita.
  • Nella riga due, sto specificando tutti i tre parametri, sebbene scostamenti in modo utilizzando abbreviato i nomi di parametro. Come con i cmdlet, è necessario digitare sufficiente il nome di parametro per Windows PowerShell decidere quale si sta parlando.
  • Riga tre Mostra me nuovamente tutti i tre parametri, sebbene scostamenti in base alla posizione, senza l'utilizzo di nomi di parametro. Purché ricordi fornire i valori nell'ordine esatto in cui sono elencati i parametri dello script, questo funzionerà correttamente.
  • Linea quattro mostra cosa accade se non si presta attenzione. In questo caso, nomecomputer $ conterrà 'SERVER' e logfile $ conterrà 2, mentre attemptcount $ conterrà 5. Che è probabile che non è destinato. Quando non si utilizzano nomi di parametro, è più difficile per essere flessibili. È inoltre più difficile per un altro utente di decodificare cosa intende, rende più difficile per loro di risolvere eventuali problemi.
  • Cinque di riga è riportato un esempio migliore. In questo caso, è stato specificato nell'ordine corretto di parametri, ma che è bene perché ho utilizzato i nomi di parametro. Come regola generale, utilizzare sempre nomi di parametro per il massimo grado di flessibilità. Non è necessario ricordare l'ordine in cui fanno riferimento.

Script avanzati

Windows PowerShell supporta una tecnica per specificare ulteriori informazioni sui parametri. In questo modo è possibile dichiarare un parametro obbligatorio, accetta l'input dalla pipeline e così via. Questa tecnica è detta associazione Cmdlet.

Non modifica il modo in cui che lo script utilizza parametri. Fornisce semplicemente la shell un po' più informazioni sui parametri. È possibile trovare questa tecnica più comunemente utilizzata in una funzione, ma la sintassi è valida all'interno di uno script anche. Ecco un semplice esempio:

[CmdletBinding()]
param (
  [Parameter(Mandatory=$True)]
  [string]$computername,

  [Parameter(Mandatory=$True)]
  [string]$logfile,

  [int]$attemptcount = 5
)

Dopo aver aggiunto era l'istruzione [CmdletBinding()] come prima riga eseguibile del codice all'interno dello script. È corretto per i commenti di far precedere, ma nessun altro elemento. Ho inoltre aggiunto un'istruzione [Parameter()] a due del mio parametri. All'interno di tale istruzione [Paramater()], ho indicato che questi parametri sono obbligatori. A questo punto, se un utente tenta di eseguire lo script senza specificare questi parametri, Windows PowerShell, verrà richiesto per le informazioni.

Si noti che l'ultimo parametro non ha istruzioni speciali e tutti e tre i parametri vengono ancora visualizzati in un elenco separato da virgole (significato i primi due parametri sono seguiti dal punto e virgola). Esistono offrono una miriade di altre istruzioni è possibile specificare per un parametro, che sia possibile leggere informazioni di about_functions_advanced_parameters argomento della Guida.

Si trattava di una revisione elettrizzante di alcuni concetti relativi alla creazione di script di chiave Windows PowerShell. Mi auguro che si è appreso qualcosa di nuovo. La possibilità di creare script con parametri è particolarmente utile, poiché è possibile creare script che cerca e si comportano come i cmdlet nativi di Windows PowerShell.

Don Jones

Don Jones è un destinatario del premio Microsoft MVP Microsoft e autore di serate "informazioni su Windows PowerShell in un mese di con" (Manning Publications, 2011), un libro, progettato per aiutare gli amministratori diventano effettive con Windows PowerShell. Jones offre anche la formazione di Windows PowerShell pubblica e on-site. È possibile contattarlo tramite il suo sito Web all'indirizzo ConcentratedTech.com.

Contenuto correlato