Esistono convenzioni di codifica PowerShell ben note?


18

Esistono convenzioni ben definite durante la programmazione in PowerShell?

Ad esempio, negli script che devono essere mantenuti a lungo termine, dobbiamo:

  • Utilizzare il nome o l'alias del cmdlet reale?
  • Specificare il nome del parametro cmdlet per intero o solo parzialmente ( dir -Recurserispetto dir -r)
  • Quando si specificano gli argomenti stringa per i cmdlet, li si racchiude tra virgolette ( New-Object 'System.Int32'rispetto aNew-Object System.Int32
  • Quando si scrivono funzioni e filtri, si specificano i tipi di parametri?
  • Scrivi cmdlet nel caso corretto (ufficiale)?
  • Per parole chiave come BEGIN...PROCESS...ENDle scrivi solo in maiuscolo?

Sembra che a MSDN manchi il documento delle convenzioni di codifica per PowerShell, mentre tale documento esiste ad esempio per C #.




2
C'è un progetto della comunità che tenta di documentare tali convenzioni. github.com/PoshCode/PowerShellPracticeAndStyle . C'è una certa differenza, lo stile è una cosa molto personale.
Chris Dent,

Risposte:


8

@Robert Harvey ha fatto riferimento ad alcuni buoni collegamenti formali. Per mezzo di un documento meno formale, i miei pensieri sarebbero:

Utilizzare il nome o l'alias del cmdlet reale?

Utilizzare l'alias solo se è più chiaro del nome completo. Ad esempio, penso che la maggior parte delle persone troverebbe diro lspiù chiaro in uno script che in Get-ChildItembase all'esperienza precedente (ad esempio, praticamente chiunque scriva uno script PowerShell ne ha una di queste due volte negli script batch DOS o negli script Unix).

Specificare il nome del parametro cmdlet per intero o solo parzialmente (dir -Recurse contro dir -r)

In uno script, spiegherei completamente il nome perché (a differenza dell'esempio precedente) non riesco a pensare a un momento in cui l'interruttore più breve sarebbe effettivamente più chiaro che spiegarlo. I nomi di switch più brevi servono per salvare la digitazione. Alla riga di comando, questo è un imperativo. In uno script, i tasti in più valgono la pena per leggibilità e manutenibilità.

Quando si specificano gli argomenti stringa per i cmdlet, li si racchiude tra virgolette (New-Object 'System.Int32' rispetto a New-Object System.Int32

Racchiudere gli argomenti di stringa tra virgolette sembra molto più chiaro quando si legge il codice, quindi li includerei.

Quando si scrivono funzioni e filtri, si specificano i tipi di parametri?

Solo quando è necessario farlo per risolvere l'ambiguità per l'interprete (cosa che accade). Se hai intenzione di provare a mettere i tipi su tutto, potresti anche andare a scrivere applicazioni da riga di comando C # (che non è sempre una cosa negativa, ma annulla i risparmi di tempo che ottieni dallo scripting).

Scrivi cmdlet nel caso corretto (ufficiale)?

Si dovrebbe . Di solito lo faccio. Quando mi sono affrettato sono stato conosciuto per essere un po 'rilassato nel caso in cui non contatta sintatticamente.

Per parole chiave come INIZIA ... PROCESSO ... FINE le scrivi solo in maiuscolo?

No. Questo non è FORTRAN. Penso che la maggior parte delle persone trovi begino Beginpiù leggibile di BEGIN. C'è una ragione per cui associamo tutti i tappi alle urla online e alle urla delle parti più banali del programma ostacolano la leggibilità attirando la propria attenzione sulle parti che contano di meno.

Il principio guida dovrebbe essere la leggibilità. Gli script, per loro stessa natura come programmi veloci e sporchi, si spostano verso il codice di sola scrittura. Dovresti prendere ogni tua decisione per assicurarti che tu e il tuo team possiate ancora capire la sceneggiatura in sei mesi. Cerca di toglierti le scarpe quando guardi il tuo codice e poni questa domanda: "Se avessi iniziato questo lavoro una settimana fa (e quindi non fosse davvero indottrinato nella cultura generale) troverei il modo in cui questo scritto è illuminante o confuso? "


2

Microsoft ha scritto e pubblicato un ottimo set di linee guida per lo sviluppo di Cmdlet

Estratto:

Gli argomenti di questa sezione forniscono linee guida per lo sviluppo che è possibile utilizzare per produrre cmdlet ben formati. Sfruttando le funzionalità comuni fornite dal runtime di Windows PowerShell e seguendo queste linee guida, è possibile sviluppare robusti cmdlet con il minimo sforzo e fornire all'utente un'esperienza coerente. Inoltre, ridurrete l'onere del test poiché le funzionalità comuni non richiedono il test.

In questa sezione

Queste linee guida non si limitano a nessuna lingua (non menzionano una lingua) e sono perfettamente applicabili quando si scrivono Cmdlet in PowerShell.

L'uso di queste linee guida ti aiuterà a scrivere Cmdlet chiari, individuabili, utilizzabili e riutilizzabili. Trovo che dopo aver creato diversi moduli PowerShell seguendo queste linee guida non sia difficile e mi ha aiutato a diventare uno sviluppatore PowerShell migliore. Tale abilità è direttamente utilizzabile anche per scrivere semplici script.


1
Questi sembrano più su come scrivere i cmdlet, piuttosto che su come scrivere PowerShell.
Philip Kendall,

@PhilipKendall lo fanno davvero. Questo potrebbe non rispondere alla domanda completa, ma credo che ciò aggiunga valore alla domanda. Nota che puoi scrivere perfettamente i tuoi Cmdlet in puro PowerShell e che anche queste linee guida sono di grande aiuto. Se riesci a scrivere un buon Cmdlet in PowerShell, allora puoi anche scrivere buoni script di PowerShell.
oɔɯǝɹ

1

Come seconda risposta; è possibile utilizzare il modulo PSScriptAnalyzer per convalidare il codice.

Invoke-ScriptAnalyzer -Path .

Si basa sull'analisi del codice, utilizzando un set di regole. Convaliderà la progettazione del codice e ti aiuterà a rilevare molti piccoli problemi nel codice.

L'abbiamo incorporato nelle nostre build (usiamo build e un repository privato per i moduli), per cogliere problemi di progettazione e qualità.

Se sei interessato, questo modulo contiene anche un formattatore di codice PowerShell (che può utilizzare più stili), quindi puoi usarlo anche per standardizzare il layout del codice.


0

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 SemicolonTerminatorlo 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. -rpotrebbe 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, -NotIncosì 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.Int32finita 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.


-3

Nel corso degli anni ci sono stati molti modi per scrivere nomi di più parole per variabili, funzioni, ecc.

PROGRAMFORSORTINGLOTSOFTHINGS è difficile da leggere.

PROGRAM_FOR_SORTING_LOTS_OF_THINGS è un po 'più semplice.

program_for_sorting_lots_of_things è ancora più semplice.

ProgramForSortingLotsOfThings elimina il carattere di sottolineatura e mantiene la leggibilità. Powershell lo fa per la maggior parte.


Powershell di solito fa un mix di involucro di cammello (che sintatticamente non significa nulla) e trattini. Ad esempio, Get-ChildItemcon un trattino tra il verbo e il sostantivo.
Andrew dice Reinstate Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.