I documenti nella risposta di @oɔɯǝɹ sono una buona fonte, anche se in qualche modo tangenziale.
Se si utilizza Visual Studio Code, che è previsto per sostituire PowerShell ISE obsoleto, e quindi si installa l' estensione VS Code PowerShell , che include diverse opzioni di formattazione che erano almeno in parte basate sulla Guida alle migliori pratiche e allo stile di PowerShell non ufficiale . Sia VS Code che l'estensione PowerShell sono gestiti da Microsoft, quindi è ufficiale quanto una guida non ufficiale.
Non sono d'accordo con tutto ciò che affermano. Ad esempio, vengo da PHP, Java, C # e SQL, dove sono previsti punti e virgola se non richiesti. Il codice mi sembra sbagliato senza di loro, quindi li includo. Se ce ne fosse uno #requires SemicolonTerminator
lo abiliterei sulla maggior parte dei miei script, quindi non devo preoccuparmi che gli spazi bianchi interrompano una riga. Odio scappare dai ritorni a capo e altri VB-ismi.
Il resto di questi sono la mia opinione:
Utilizzare il nome o l'alias del cmdlet reale?
Sii inequivocabile. Non usare mai un alias in uno script salvato; anche un alias predefinito. Non c'è nulla che impedisce a un utente di modificare gli alias predefiniti. È più sicuro presumere che non siano immutabili.
Specificare il nome del parametro cmdlet per intero o solo parzialmente (dir -Recurse contro dir -r)
Ancora una volta, sii inequivocabile. I nomi dei parametri completi hanno la migliore compatibilità diretta. -r
potrebbe essere inequivocabile oggi, ma non c'è nulla che impedisce alle future versioni di un comando di introdurre nuovi parametri. Utilizzerai un IDE (codice ISE o VS). Premi Ctrl+ Spacee completa automaticamente quel parametro.
Si noti che ls -r
è ambiguo. -ReadOnly
è un altro parametro di Get-ChildItem
.
Quando si specificano gli argomenti stringa per i cmdlet, li si racchiude tra virgolette (New-Object 'System.Int32' rispetto a New-Object System.Int32
In generale, le virgolette devono essere utilizzate solo quando necessario (ad esempio, New-Object -TypeName 'System.Collections.Generic.HashSet[System.Int32]'
utilizzare virgolette singole quando è possibile e solo doppie virgolette quando è necessario incapsulare virgolette singole o è necessario incorporare variabili.
Quando si scrivono funzioni e filtri, si specificano i tipi di parametri?
In genere lo faccio, a meno che non sia necessario accettare una vasta gamma di tipi con lo stesso parametro e non voglia scrivere singoli set di parametri.
Scrivi cmdlet nel caso corretto (ufficiale)?
Caso Pascal. Sì.
Per parole chiave come INIZIA ... PROCESSO ... FINE le scrivi solo in maiuscolo?
Ho visto le dichiarazioni, gli operatori e costrutti di linguaggio come Begin
, If
, ForEach
, -NotIn
così come begin
, if
, foreach
, -notin
. Personalmente preferisco le lettere minuscole e lascio i comandi come maiuscole, ma sono entrambi ugualmente comuni.
Altri:
Specifica sempre i parametri. Non fare affidamento sull'ordine posizionale. New-Object -TypeName System.Int32
finita New-Object System.Int32
. Non so se sia stato concordato, ma, ancora una volta, sembra supportare l'idea generale di "essere inequivocabile".
Se sto scrivendo un modulo, uso i verbi standard indicati da Get-Verb
. Questo elenco è estremamente stretto, tuttavia, quindi i nomi degli script autonomi per gli script che solo io stesso eseguirò spesso non. Il problema con l'elenco di verbi generici è che tende verso Get-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1
. Se sto scrivendo uno script che estrae determinate pagine da un file PDF, non lo sto chiamando Get-ExtractedAccountPDFPages.ps1
. Lo sto chiamando Extract-AccountPDFPages.ps1
. Non sono preoccupato per la rilevabilità di uno script che funziona come un programma stesso e non è pensato per essere modulare per sua stessa natura.
Infrangere le regole quando è più leggibile, più concreto o più mantenibile.