@oɔɯǝɹ的答案中的文档是很好的(即使是切向的)来源。
如果使用计划替换老化的PowerShell ISE的Visual Studio Code,然后安装VS Code PowerShell扩展,则该扩展包括多个格式设置选项,这些选项至少部分基于非官方PowerShell最佳实践和样式指南。VS Code和PowerShell扩展都由Microsoft管理,因此它的官方发行版可以说是官方的。
我不同意他们所说的一切。例如,我来自PHP,Java,C#和SQL,如果不需要,则应使用分号。没有它们,代码对我来说似乎是错误的,因此我将它们包括在内。如果有,#requires SemicolonTerminator
我会在大多数脚本中启用它,这样我就不必担心空格换行。我讨厌回车和其他VB主义。
这些是我的其余观点:
使用真实的cmdlet名称还是别名?
要明确。切勿在已保存的脚本中使用别名;甚至是默认别名。没有什么可以阻止用户更改默认别名。假设它们不是一成不变的,这是更安全的做法。
完全或部分指定cmdlet参数名称(dir -Recurse与dir -r)
同样,要明确。完整的参数名称具有最佳的前向兼容性。 -r
在今天可能并不确定,但是没有什么可以阻止命令的未来版本引入新参数的。您将要使用IDE(ISE或VS Code)。点击Ctrl+ Space并自动完成该参数。
注意这ls -r
是模棱两可的。 -ReadOnly
是的另一个参数Get-ChildItem
。
为cmdlet指定字符串参数时,是否将其括在引号中(New-Object'System.Int32'与New-Object System.Int32
通常,仅在必要时才使用引号(例如,New-Object -TypeName 'System.Collections.Generic.HashSet[System.Int32]'
。时,请使用单引号;当您需要封装单引号或需要嵌入变量时,请仅使用双引号。
在编写函数和过滤器时,是否指定参数的类型?
我通常会这样做,除非我特别需要接受具有相同参数的多种类型,并且不想编写单独的参数集。
您是否在(正式)正确的情况下编写cmdlet?
帕斯卡案。是。
对于像BEGIN ... PROCESS ... END这样的关键字,您仅将它们写为大写吗?
我见过的语句,运算符,和语言结构Begin
,If
,ForEach
,-NotIn
以及begin
,if
,foreach
,-notin
。就我个人而言,我更喜欢小写字母,而命令却保留为Pascal大小写,但是它们都一样普遍。
其他:
始终指定参数。不要依赖位置顺序。 New-Object -TypeName System.Int32
结束New-Object System.Int32
。我不知道是否同意这一点,但是,这似乎再次支持“明确”的一般想法。
如果我正在编写模块,则使用指示的标准动词Get-Verb
。但是,此列表非常狭窄,因此,只有我自己会运行的脚本的独立脚本名称通常不会。通用动词列表的问题是它趋向于Get-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1
。如果我正在编写从PDF文件提取某些页面的脚本,则不会调用它Get-ExtractedAccountPDFPages.ps1
。我叫它Extract-AccountPDFPages.ps1
。我并不担心脚本本身是否可以作为程序运行,并且其本质并非旨在模块化。
当它更具可读性,更具体或更易于维护时,请打破规则。