Os documentos na resposta de @ oɔɯǝɹ são uma fonte boa, ainda que um pouco tangencial.
Se você usa o Visual Studio Code, que está planejado para substituir o PowerShell ISE antigo, e instala a extensão VS Code PowerShell , que inclui várias opções de formatação, que foram pelo menos parcialmente baseadas no Guia não oficial de práticas recomendadas e estilo do PowerShell . O VS Code e a extensão do PowerShell são gerenciados pela Microsoft, por isso é tão oficial quanto um guia não oficial.
Eu não concordo com tudo o que eles afirmam. Por exemplo, eu venho de PHP, Java, C # e SQL, onde ponto e vírgula é esperado, se não for necessário. O código parece errado para mim sem eles, então eu os incluo. Se houvesse um, #requires SemicolonTerminator
eu o habilitaria na maioria dos meus scripts, para que eu não precisasse me preocupar com o espaço em branco quebrando uma linha. Eu odeio escapar de retornos de carro e outros VB-ismos.
O restante é a minha opinião:
Use o nome ou o alias real do cmdlet?
Seja inequívoco. Nunca use um alias em um script salvo; até um alias padrão. Não há nada que impeça um usuário de alterar aliases padrão. É mais seguro supor que eles não sejam imutáveis.
Especifique o nome do parâmetro do cmdlet na íntegra ou apenas parcialmente (dir -Recurse versus dir -r)
Mais uma vez, seja inequívoco. Os nomes completos dos parâmetros têm a melhor compatibilidade direta. -r
hoje pode ser inequívoco, mas não há nada que impeça que versões futuras de um comando introduzam novos parâmetros. Você usará um IDE (código ISE ou VS). Pressione Ctrl+ Spacee preencha automaticamente esse parâmetro.
Note que ls -r
é ambíguo. -ReadOnly
é outro parâmetro deGet-ChildItem
.
Ao especificar argumentos de seqüência de caracteres para cmdlets, você os coloca entre aspas (New-Object 'System.Int32' versus New-Object System.Int32
Em geral, as cotações devem ser usadas apenas quando necessário (por exemplo, New-Object -TypeName 'System.Collections.Generic.HashSet[System.Int32]'
use aspas simples quando você puder e apenas aspas duplas quando precisar encapsular aspas simples ou incorporar variáveis.
Ao escrever funções e filtros, você especifica os tipos de parâmetros?
Normalmente, a menos que precise especificamente aceitar uma grande variedade de tipos com o mesmo parâmetro e não queira escrever conjuntos de parâmetros individuais.
Você escreve cmdlets no caso correto (oficial)?
Caso Pascal. Sim.
Para palavras-chave como BEGIN ... PROCESS ... END, você as escreve apenas em maiúsculas?
Eu vi declarações, operadores e construções de linguagem como Begin
, If
, ForEach
, -NotIn
, bem como begin
, if
, foreach
,-notin
. Pessoalmente, prefiro letras minúsculas e deixo comandos como Pascal, mas ambos são igualmente comuns.
Outras:
Sempre especifique parâmetros. Não confie na ordem posicional. New-Object -TypeName System.Int32
acabou New-Object System.Int32
. Não sei se isso está de acordo, mas, novamente, parece apoiar a ideia geral de "ser inequívoco".
Se estou escrevendo um módulo, uso verbos padrão indicados por Get-Verb
. Essa lista é extremamente estreita, no entanto, nomes de script autônomos para scripts que somente eu mesmo executamos com freqüência não. O problema com a lista de verbos genéricos é que ela tende para dentro Get-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1
. Se estou escrevendo um script que extrai determinadas páginas de um arquivo PDF, não o estou chamando Get-ExtractedAccountPDFPages.ps1
. Estou chamandoExtract-AccountPDFPages.ps1
. Não estou preocupado com a descoberta de um script que é executado como um programa em si e não se destina a ser modular por sua própria natureza.
Quebre as regras quando for mais legível, mais concreto ou mais sustentável.