I documenti nella risposta di @ oɔɯǝɹ sono una buona fonte, anche se in qualche modo tangenziale.
Se utilizzi Visual Studio Code, che è pianificato per sostituire l'obsoleto PowerShell ISE, quindi installa l'estensione PowerShell VS Code , che include diverse opzioni di formattazione che era almeno parzialmente basato sul Migliori pratiche e guida di stile di PowerShell non ufficiale . Sia VS Code che l'estensione PowerShell sono gestiti da Microsoft, quindi è quasi ufficiale come può essere una guida non ufficiale.
Non sono d'accordo con tutto ciò che affermano. Ad esempio, io vengo da PHP, Java, C # e SQL dove sono previsti punti e virgola se non richiesti. Il codice sembra sbagliato per me senza di loro, quindi li includo. Se ci fosse un #requires SemicolonTerminator
, lo abiliterei nella maggior parte dei miei script, quindi non devo preoccuparmi di rompere una riga in spazi vuoti. Odio sfuggire a ritorni a capo e altri VB-ismo.
Il resto di questi sono la mia opinione:
Use the real cmdlet name or alias?
Sii inequivocabile. Non usare mai un alias in uno script salvato; anche un alias predefinito. Non c'è nulla che impedisca a un utente di cambiare gli alias predefiniti. È più sicuro supporre che non siano immutabili.
Specify the cmdlet parameter name in full or only partially (dir -Recurse versus 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 impedisca alle future versioni di un comando di introdurre nuovi parametri. Stai per utilizzare un IDE (codice ISE o VS). Premi Ctrl + Spazio e completa automaticamente tale parametro.
Tieni presente che ls -r
è ambiguo. -ReadOnly
è un altro parametro di Get-ChildItem
.
When specifying string arguments for cmdlets do you enclose them in quotes (New-Object 'System.Int32' versus New-Object System.Int32
In generale, le virgolette dovrebbero essere utilizzate solo quando necessario (ad es., New-Object -TypeName 'System.Collections.Generic.HashSet[System.Int32]'
. Utilizza virgolette singole quando puoi, e solo virgolette doppie quando hai bisogno di incapsulare virgolette singole o di inserire variabili.
When writing functions and filters do you specify the types of parameters?
Di solito lo faccio, a meno che non abbia specificamente bisogno di accettare un'ampia varietà di tipi con lo stesso parametro e non voglio scrivere singoli set di parametri.
Do you write cmdlets in the (official) correct case?
Caso Pascal. Sì.
For keywords like BEGIN...PROCESS...END do you write them in uppercase only?
Ho visto istruzioni, operatori e costrutti di linguaggio come Begin
, If
, ForEach
, -NotIn
e begin
, if
, foreach
, -notin
. Personalmente, preferisco la minuscola e lasciare i comandi come caso Pascal, ma sono entrambi ugualmente comuni.
Altro:
-
Specifica sempre i parametri. Non fare affidamento sull'ordine posizionale. New-Object -TypeName System.Int32
su New-Object System.Int32
. Non so se sia stato concordato, ma, ancora, sembra sostenere l'idea generale di "essere non ambigui".
-
Se sto scrivendo un modulo, uso i verbi standard indicati da Get-Verb
. Questo elenco è estremamente limitato, tuttavia, i nomi di script autonomi per script che solo io stesso eseguirò spesso non lo fanno. Il problema con la lista di verbi generici è che tende verso Get-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1
. Se sto scrivendo uno script che estrae determinate pagine da un file PDF, non lo chiamo Get-ExtractedAccountPDFPages.ps1
. Lo chiamo Extract-AccountPDFPages.ps1
. Non sono preoccupato della rilevabilità di uno script che viene eseguito come un programma stesso e non è concepito per essere modulare in base alla sua natura.
-
Rompi le regole quando è più leggibile, più concreto o più gestibile.