Windows PowerShell: 空白,请

正确的格式设置(包括各个位置适当留一些空格)可使您的 Windows PowerShell 命令变得更易于理解。

Don Jones

看一看下面的函数,请告诉我您认为它将执行操作。 这是真实,完全正常工作"高级函数。您的目标是到 (但不实际运行它) 只需告诉我它应当做什么:

function Get-PCInfo { [CmdletBinding()] param( [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)][string[]]$computername ) PROCESS { Write-Verbose "Beginning PROCESS block" foreach ($computer in $computername) { Write-Verbose "Connecting to $computer" try {$continue = $true $cs = Get-WmiObject -EV mybad -EA Stop -Class Win32_computersystem -ComputerName $computer } catch {$continue = $false $computer | Out-File -FilePath oops.txt -append Write-Verbose "$computer failed" $mybad | ForEach-Object { Write-Verbose $_ } }if ($continue) { $proc = Get-WmiObject win32_processor -ComputerName $computer | select -first 1 $obj = new-object -TypeNamePSObject $obj | add-member NotePropertyComputerName $computer $obj | add-member NotePropertyProcArchitecture $proc.addresswidth $obj | add-member NoteProperty Domain $cs.domain $obj | add-memberNotePropertyPCModel $cs.model $obj.psobject.typenames.insert(0,'MyPCInfo') write-output $obj }}}}

很难确定,不是吗? 这是因为该函数将在 Internet 上和许多自己的文件夹中显示的脚本和示例,您会发现所有十分常见故障。 它不使用空格。 现在考虑此修订后的示例:

function Get-PCInfo { [CmdletBinding()] param( [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)] [string[]]$computername ) PROCESS { Write-Verbose "Beginning PROCESS block" foreach ($computer in $computername) { Write-Verbose "Connecting to $computer" try { $continue = $true $cs = Get-WmiObject -EV mybad -EA Stop ` -Class Win32_computersystem ` -ComputerName $computer } catch { $continue = $false $computer | Out-File -FilePath oops.txt -append Write-Verbose "$computer failed" $mybad | ForEach-Object { Write-Verbose $_ } } if ($continue) { $proc = Get-WmiObject win32_processor ` -ComputerName $computer | select -first 1 $obj = new-object -TypeNamePSObject $obj | add-member NotePropertyComputerName $computer $obj | add-member NotePropertyProcArchitecture $proc.addresswidth $obj | add-member NoteProperty Domain $cs.domain $obj | add-memberNotePropertyPCModel $cs.model $obj.psobject.typenames.insert(0,'MyPCInfo') write-output $obj } } } }

噢,是更容易跟踪。 {构造} 中的命令会缩进。 长命令可以很好地自动换行。 它是得更具可读性。

它是为了帮助调试脚本,它可以很好地设置格式时,有人变得如此简单。 只是尝试查找单放错位置或丢失的花括号时没有任何目的。 您可以在视力不佳。 麻烦的是,很多人没有意识到如何实现这种格式。 现在让我们来解决这一问题。

缩进

大多数的脚本编辑器工作很好地用于 Tab 键,包括免费的 Windows PowerShell ISE 附带 Windows PowerShell 版本 2 安装程序。 一些可能插入四个或五个空格而不是实际的制表符,但这没什么关系。 大多数使您可以突出显示的命令块,然后按选项卡以缩进或按 Shift + Tab 它们取消缩进。

那很方便,和它鼓励您将查找干净代码,从而轻松地做到这一点。 大多数编辑器还将维护您缩进,这意味着完成键入一个行和命中的 Enter 后,光标开始相同的缩进位置处的下一行。

换行

这是非常-不太明显的目的,特别是在 Windows PowerShell 脚本中。 其思想是尝试并防止行水平环绕,除非绝对必要。 Windows PowerShell,您实际上可以换行后告知外壳"有更多的出现,"的任何字符包括:

  • 逗号
  • 分号
  • 管道

查看"改进"示例查看我的意思。

您还可以使用 Windows PowerShell 转义字符: 以反引号 (')。 如果您立即按照以回车以反引号,它"转义"该回车。 这将强制 Windows PowerShell 物理下行视为同一个逻辑行的一部分。 换句话说,它是什么样的行继续符。 我讨厌,不过。 它很难看到屏幕上,并在打印,很容易混淆死像素显示器或一块游离在页面上的碳粉盒上。

也很容易滥用行为。 如果您按照与空间、 选项卡或另一个硬参见空格字符以反引号,然后它将不会作为行继续符。 它将不会逃过一个回车。 我使用过它几次"改进"示例中,只需以便无法看到它。 随意不使用该技术,如果有更好的方法。

一致性

一致的格式非常重要。 例如,我更愿意做这样的构造:

if ($continue) { # some code goes here }

虽然其他人 (如格式更好地:

if ($continue) { # some code goes here }

使用者为准) 设置格式,但是选取其中一个并严格遵守与之。 目标是使代码更一致且易于阅读。

请返回并重新设置格式

深入一些那些丑陋的旧脚本,您已经已运行,先花几分钟重新格式化它们。 将执行出色的表现为任何较差的人有六个月内应付自如并找出您所想。 再说,很可能是好此"较差的人"将为您的。

Don Jones

**Don Jones**是一个 Microsoft MVP 奖收件人和"学习 Windows PowerShell 中每月的食谱"(Manning 出版物有限公司,2010年),旨在帮助生效 Windows PowerShell 与任何管理员一本书的作者。 此外,Jones 还提供公开和现场 Windows PowerShell 培训。 与他联系通过他的网站 ConcentratedTech.com

相关内容