巧用PowerShell参数防止操作失误

日期: 2016-06-29 作者:Adam Bertram翻译:杨旭 来源:TechTarget中国 英文

Windows PowerShell脚本可以节省你大量的时间。PowerShell提供自动化能力,通过命令行可以管理一切微软基础设施。PowerShell脚本可以是简单的,比如用来列举一组文件或注册表键。另外,数百行的PowerShell脚本可以产生一个色彩鲜明、格式适当的,详尽的服务器库存报告。

在具体操作中,PowerShell会读取各种配置项。PowerShell并不改变什么,它只是报告当前状态。这些操作通常由cmdlet完成。 PowerShell也可以执行各种添加、删除和修改操作。

Cmdlet通过New、New和Set等动词来代表这些操作。如果你有较高的权限级别,使用PowerShel……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

Windows PowerShell脚本可以节省你大量的时间。PowerShell提供自动化能力,通过命令行可以管理一切微软基础设施。PowerShell脚本可以是简单的,比如用来列举一组文件或注册表键。另外,数百行的PowerShell脚本可以产生一个色彩鲜明、格式适当的,详尽的服务器库存报告。在具体操作中,PowerShell会读取各种配置项。PowerShell并不改变什么,它只是报告当前状态。这些操作通常由cmdlet完成。

PowerShell也可以执行各种添加、删除和修改操作。Cmdlet通过New、New和Set等动词来代表这些操作。如果你有较高的权限级别,使用PowerShell自动化操作可以帮助你节省大量的时间——或产生问题——当自动化出错的时候。有一句话说“自动化是造成大规模失败的最佳方式”,这简直不能再真实了。幸运的是,巧用PowerShell参数可以防止发生更改脚本意外。

在本文中,我们将介绍如何构建功能并生成相应报表。这叫做WhatIf支持。我们还将讨论如何创建Windows PowerShell功能提示,询问你是否确定执行某些操作。

PowerShell功能函数实例

这里以删除一台虚构的虚拟机(VM)为例。假设你已经建立了这样的功能:删除一台VM并完成清理工作。

以参数名$VMName代表这台虚拟机的名称。当你运行Remove-MyVM –VMName VM123,将立即删除该虚拟机,并且如你所愿进行清理。

Function Remove-MyVM

{

    [CmdletBinding()]

    param(

          [Parameter()]

          [string]$VMName

)

Remove-VM –VM $VMName

}

有一天,你不小心输入了错误的VM名称,并且在来不及思考前按下了回车:

Remove-MyVM –VMName SUPERIMPORTANTVM

待你反应过来,这台VM已经不见了。这种悲剧能避免吗?当然,而且我们有两种不同的方法。

使用WhatIf支持

第一种方法是建立WhatIf支持。有两个要求:在功能函数中添加关键字SupportsShouldProcess;添加if/then声明,以确定是否执行该任务或者产生行为报告。

Function Remove-MyVM

{

   [CmdletBinding(SupportsShouldProcess)]

   param(

        [Parameter()]

        [string]$VMName

   )

   if ($PSCmdlet.ShouldProcess("VM $VMName",'Remove')) {

       Remove-VM –VM $VMName

   }      

}

通过合并这两个功能,你现在有能力使用–WhatIf参数提前知道将会发生什么变化。

图1. 在做任何更改之前,WhatIf参数会进行测试

图1. 在做任何更改之前,WhatIf参数会给出提示

可以看到,简单地使用–WhatIf参数就能提供下一步的动作信息。Remove和VM MYVM字符串均是ShouldProcess()函数中的PowerShell参数。

Remove-MyVM –Confirm

还有一道安全保障:当使用SupportsShouldProcess时,PowerShell能够支持–Confirm参数。不用更改上述功能函数,我们就可以使用Confirm参数。

图2. Confirm参数提示将要执行的操作

图2. Confirm参数提示将要执行的操作

Confirm参数会每次给出提示,但一定要记住使用该参数。如果你不相信自己,想每次再确认?你可以设置函数的可能性影响,然后对比当前的阈值。

要做到这一点,你的功能函数必须使用$ConfirmPreferences变量来设置可能性结果。如果大于该结果,将自动提示;如果低于当前结果,则继续通过。

你可以看到,我把$ConfirmPreferences变量设置成High。

图3. 通过设置ConfirmPreference变量设置自动提示

图3. 通过设置ConfirmPreference变量设置自动提示

这意味着我的函数必须是High才会自动提示。这时可以使用ConfirmImpact关键字,并将其设置为High。

Function Remove-MyVM

{

   [CmdletBinding(SupportsShouldProcess,ConfirmImpact = 'High')]

   param(

        [Parameter()]

        [string]$VMName

   )

   if ($PSCmdlet.ShouldProcess("VM $VMName",'Remove')) {

       Remove-VM –VM $VMName

   }

}

现在,运行该参数,出现自动提示。

图4. 运行Remove-MyVM函数

图4. 运行Remove-MyVM函数

这是因为我的功能函数设置的值等于或高于$ConfirmPreference变量中的值,所以会出现自动提示。

正如你所看到的,WhatIf和Confirm PowerShell参数可以拯救你所犯下的错误。你只需要记得提前将这些参数添加到PowerShell功能中。当然,WhatIf和Confirm还有更多的使用方法等待你去发现和学习。

作者

Adam Bertram
Adam Bertram

自由撰稿人

相关推荐