Windows PowerShell Non da script

Don Jones

Contenuto

Non un utilizzo eccessivo di variabili
Nomi di variabili significativi
Semplificare il confronto
Non interrompere di script
Il ciclo di ciclo
Non è pertanto trasparente
Show Me di script

Apportate di recente un'offerta (che sta ancora) a lettori del mio ConcentratedTech.comblog: Invia messaggio gli script Windows PowerShell e verrà esaminarli e qualsiasi è necessario migliorare i suggerimenti. L'idea proviene effettivamente da un sondaggio miei blogger di co e che è stato eseguito, un lettore suggerito che questo potrebbe offrire un metodo grande reali per migliorare le proprie competenze script gli utenti. Relativo agli ultimi alcuni mesi, ho notato alcune tendenze come è possibile trovare uso personale che effettua numerosi suggerimenti particolari ripetutamente. Pertanto è stato compilato un elenco di essi per condividere con qui.

Consenti primo stato, tuttavia, che uno script che ottiene il processo eseguito (correttamente e senza danni collateral, ovviamente) è uno script valido. Alcune operazioni che sono suggerimento potrebbe sembrare nitpicky e alcuni di essi sono certamente. Tuttavia, ogni i suggerimenti avere alcuni vantaggi distinti, che verranno per sottolineare come possibile tentare di.

Non richiedere la illegale se effettivamente si sta eseguendo alcune tra le "procedure non valide" è sottolineare. So che molto di persone lo script in Windows PowerShell è stato avviato dalla creazione di script con VBScript e alcune di queste procedure"non valide" sono effettivamente molto comuni nel mondo di VBScript. Questo è un'imperdibile opportunità, quindi, come Windows PowerShell e VBScript sono un po' diverso e come scrivere script che utilizzano che Windows PowerShell ha da offrire vantaggi univoco.

Con quello definito, seguito sono riportati i superiore sei comuni suggerimenti effettuate alcuni mesi precedenti.

Non un utilizzo eccessivo di variabili

Certo, le variabili sono utili, ma è opportuno non ottenere eseguite immediatamente. Questo tipo di script molto è stato visualizzazione:

$varfile = "c:\names.txt"
$varexists = Test-Path $varfile
if ($varexists –eq $false) {
  Write-Output "The file $varfile does not exist"
  break
}
$varnames = Get-Content $varfile

Esistono poche procedure consigliate che si desidera vedere modificati in un esempio simile al seguente. Anzitutto, c'è poco necessità di utilizzare tutte le informazioni che nelle variabili. È possibile riscrivere questo con un minor numero di variabili. Perché preoccuparsi? Bene, la shell potrebbe non limitare quanti variabili è utilizzare, ma sono un grande, grande il fan di creazione di script come leggibile possibile in modo altri utenti possano leggere lo script su carta o in un editor di script e poter determinare le operazioni eseguite lo script. Le variabili più includere, più un utente avrà tenere traccia nel suo testina, e il meno probabile che ha verrà possibile capire che cosa lo script è fino a. Se è impossibile determinare lo script su carta, sono meno probabile che sia in grado di eseguire il debug di script se c'è un problema. In modo che desidera iniziare a riscrittura in questo esempio come indicato di seguito:

$varfile = "c:\names.txt"
If ((Test-Path $varfile) –eq $false) {
Write-Output "The file $varfile does not   exist"
  break
}
$varnames = Get-Content $varfile

Tutti sono effettivamente eseguire è eliminando la variabile di varexists $ e utilizzando direttamente l'output del percorso del test. In questo modo, non è necessario esaminare se costruire, vedere varexists $, quindi tornare indietro e scoprire quali varexists $ dovrebbe per contenere. È minore per me tenere traccia nella mia testa. Si noti che a sinistra $ varfile; questo poiché tali informazioni utilizzano tre volte, se le informazioni da riutilizzare più volte, quindi è importante inserire in una variabile.

Nomi di variabili significativi

Continuando con l'esempio precedente, tenere sempre presente che i nomi delle variabili è utile ricordare all'interno di una variabile. Non è necessario utilizzare i prefissi di nome come "var" perché il carattere $ indica che si tratta di una variabile. Nome infatti, i prefissi quali "str" per le stringhe o "int" per i valori integer non sono aggiornati ("Ecco è 1993" È ad esempio quando sono insegnamento classi). Utilizzare nomi di variabili semplici. Ecco riscritto l'esempio:

$filename = "c:\names.txt"
If ((Test-Path $filename) –eq $false) {
Write-Output "The file $filename does not exist"
  break
}
$computernames = Get-Content $filename

Semplificare il confronto

Non sono un fan degli operatori di confronto in Windows PowerShell, ovvero quelle come –gt, - lt, - eq e così via. La mancanza di fondness probabilmente proviene da mia esperienza con VBScript, in cui operatori familiari potrebbe utilizzare ad esempio lungo >, < e =. Molti probabilmente riconoscere questi operatori da lezioni matematiche scuola di valutazione e pertanto richiedono meno mentale analisi quando si leggono i. Quando possibile, quindi mi piace evitare l'utilizzo di un operatore. E qualsiasi condizione in cui è cercare qualcosa da true o false è un'opportunità per eliminare un operatore:

$filename = "c:\names.txt"
If (-not (Test-Path $filename)) {
Write-Output "The file $filename does not exist"
  break
}
$computernames = Get-Content $filename

Poiché il cmdlet del percorso di test restituisce true o false, non c'è dover confrontare a true o false. Tutti gli elementi all'interno di se costruisce parentesi deve boil verso il basso su true o false. In genere, è possibile utilizzare un confronto per ottenere che, ma se qualsiasi è in tale posizione è già generazione true o false, è possibile semplicemente utilizzare tale informazioni direttamente.

Noti che l'operatore –not è uno che effettivamente si desidera. È più come inglese comune equivalente! = operatore utilizzato da molte lingue.

Inoltre, deve commentare le parentesi che sono inserimento test-percorso e il parametro di input nome file $. È stato avviato i comandi di inclusione tra parentesi perché aiuta me visivamente afferrare li come una singola unità. Windows PowerShell utilizza gli spazi, anziché un altro carattere per separare i comandi, i nomi dei parametri e i valori dei parametri. Racchiudendo la stringa di intero comando parentesi utile visualizzarla tutti insieme, senza imporre effettivamente esaminare gli spazi e determinare in cui il comando avvia e interrompe.

Non interrompere di script

Il suggerimento ultimo, che è necessario per questo esempio in esecuzione è il metodo che si basa la logica. Se il file non esiste, interrompere lo script. Se il file esiste, non eseguire mai l'istruzione di interruzione e pertanto lo script continua. Quando possibile, vorrei evitare di utilizzare interruzione per uscire da uno script. È possibile riscrivere l'esempio, nuovo, come illustrato di seguito:

$filename = "c:\names.txt"
If (Test-Path $filename) {
$computernames = Get-Content $filename
  # do whatever we planned to do
} else {
Write-Output "The file $filename does not exist"
}

In questo modo, È stato semplificato la logica se costruire. Stati eliminati anche la necessità di utilizzare l'istruzione di interruzione, che consente di ridurre la confusione sulle operazioni di script. Sono i primi ad ammettere che questo suggerimento assolutamente è un nitpick, ma penso buona consigliate rendono meglio gli script e questo è indubbiamente una pratica migliore rispetto a chiusura all'esterno di uno script a metà tramite. Questo tipo di costrutto è più facile eseguire il debug, ed è molto più semplice seguire carta Se si sta esaminando uno script e tenta di scoprire cosa.

Il ciclo di ciclo

Numerosi gli script che è rivisto necessario leggere le informazioni da un file di testo e il ciclo di ogni riga del file. Ad esempio, è possibile che si desidera contattare una serie di computer, in modo che è Impossibile elencare i rispettivi nomi, un nome per riga in un file di testo. Ecco un costrutto comune che ho visto:

$line = 0
$names = get-content c:\names.txt
while ($line –lt $names.length) {
  # do something with $names[$line]
  $line++
}

Questo carica il file nei nomi di $ variabile e quindi manualmente enumerato l'insieme come se fosse una matrice. La variabile di riga $ tiene traccia di quale riga si utilizza. Tutto funziona correttamente, ma sono eseguendo un po' più di lavoro è necessario eseguire e è rendendo un po' più difficile il codice per qualcun altro per la lettura in un secondo momento. Il costrutto ForEach in Windows PowerShell è un po' più appropriato per l'enumerazione degli insiemi. (Dal punto di vista tecnico, Get-Content restituisce un insieme, non è una matrice). Provare a utilizzare questo:

Foreach ($name in (Get-Content c:\names.txt))
{
  # do something with $name
}

Esistono pochi vantaggi qui. Mantenendo il suggerimento precedente, è mettere la chiamata a Get-Content a destra all'interno del costrutto, poiché si ritiene che rende un po' più chiaro in cosa sta succedendo. ForEach verrà enumerare l'intero insieme, indipendentemente dal tempo che si tratti. Ogni volta che, verrà prendere l'elemento successivo dell'insieme e inserire tale elemento nella variabile di nome $. In modo che il nome della variabile rappresenti il relativo contenuto, ovvero un nome computer. E che rende più semplice per leggere e seguire lo script.

Windows PowerShell Q & A

Q È disponibile un modo per definire un alias personalizzato permanente in Windows PowerShell?

A se mai avere creato un nuovo alias, probabilmente notato che scompare quando si chiude la shell. Ad esempio, questo crea una nuovo d alias, che è un collegamento al comando Get-ChildItem:

Nuovo alias d Get-ChildItem

Ma quando si chiude la shell, l'alias viene perso. Il trucco consiste nel creare un profilo di Windows PowerShell. Nella cartella di documenti è possibile creare una nuova cartella denominata WindowsPowerShell. All'interno di tale cartella, è possibile creare un file di testo denominato profile.ps1. In tale file di testo, inserire i comandi che si desidera eseguire automaticamente ogni volta che avvia la shell, tra cui una nuova definizione di alias. Il profilo garantisce che i comandi eseguiti ogni volta che si avvia la shell, creazione di un alias "permanente", che risulta sempre disponibile in Windows PowerShell.

Non è necessario preoccuparsi sulla quale riga si utilizza con o mantenere una variabile di riga $ per tenere traccia di che, il costrutto ForEach è che per me. Eliminazione di tre righe di codice rende un po' più breve il codice e richiede tenere traccia delle operazioni meno nella testina quando si tenta di scoprire cosa è lo script.

Non è pertanto trasparente

Una esercitazione che si desidera realmente nip in di ovatta è di eliminazione di errori di shell in un intero script. Ad esempio che si sta esaminando uno script che include questo diritto di riga nella parte superiore:

$ErrorActionPreference = "SilentlyContinue"

Per arrestare immediatamente.

Questo non rende errori chiusa, ma eliminare tali. Sì, esistono certamente casi quando si verrà prevede e si desidera ignorare un determinato errore, ad esempio quando si utilizza Strumentazione gestione Windows (WMI) per connettersi a computer remoti che potenzialmente non sono disponibili. Ma c'è mai un motivo a livello globale ignorare gli errori. Messaggi di errore sono utili ed evidenziare problemi che è talvolta possibile risolvere.

Se si desidera ignorare gli errori per un particolare cmdlet, è possibile farlo aggiungendo il parametro di "SilentlyContinue" –EA che cmdlet. Se si desidera ignorare gli errori per diversi comandi in una riga, aggiungere il parametro –EA ogni o aggiungere la riga di ErrorActionPreference $ immediatamente prima i comandi e dopo i comandi, aggiungere:

$ErrorActionPreference = "Continue"

In questo modo al normale di gestione degli errori.

Personalmente, non mi piace disattivazione errori affatto a meno che non sono Gestione manualmente tali errori. Ad esempio:

Trap {
  # output error to a log file or something
}
Get-WmiObject Win32_Service –computerName $remote –EA Stop

In questo esempio breve viene illustrato il come il parametro di "Stop" –EA genererà eccezioni true, anziché solo messaggi di errore, fornendo l'opportunità di intercettare tali e gestirli in modo autonomo. Si potrebbe registrare tali in un file, visualizzato un messaggio di errore più descrittivo oppure non eseguire qualcos'altro a tale operazione.

Show Me di script

Come detto in precedenza, alcuni di questi stati nitpicky un bit, ma offrono diversi vantaggi che vale la pena prendere in considerazione. È possibile condividere i propri script Windows PowerShell invito. I esaminare un paio di ogni mese e registrare i suggerimenti ConcentratedTech.com. È possibile cercare a parte i suggerimenti precedenti e forse anche inviare script personalizzati per la revisione. Ricerca Avanti per l'ascolto da parte dell'utente!

Don Jones è un co-fondatore di tecnologia incentrati. È possibile leggere i suggerimenti su Windows PowerShell e altri argomenti IT, e come contattare Don, sul suo blog all' ConcentratedTech.com.