【发布时间】:2016-09-26 02:32:56
【问题描述】:
我正在编写一个支持ShouldProcess 的Powershell cmdlet。我想要一个取决于传递给 cmdlet 的参数值的“动态”值,而不是固定的 ConfirmImpact 值。让我用一个例子来说明。
让我们假设我是一个网络托管服务提供商。我有很多网站,每个网站都属于以下类别之一,按重要性排序:Production、Test 和 Development。作为托管管理的一部分,我有一个用于破坏网站的Remove-WebSite cmdlet。以下代码说明了这一点:
Class WebSite {
[string] $Name
[string] $Category # Can be one of: Production, Test, Development
}
Function Remove-WebSite {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[WebSite] $WebSite
)
Write-Host "$($WebSite.Name) was destroyed"
}
目前网站在未经确认的情况下被销毁。虽然这很方便,但太多的实习生错误地破坏了生产站点,所以我希望利用 Powershell 的 ShouldProcess 功能在 Remove-WebSite cmdlet 上多一点安全网。
所以我将SupportsShouldProcess 和ConfirmImpact 值添加到CmdletBinding 属性。我的 cmdlet 定义变为:
Function Remove-WebSite {
[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='High')]
Param(
[Parameter(Mandatory=$true)]
[WebSite] $WebSite
)
if ($PSCmdlet.ShouldProcess("$($WebSite.Category) site $($WebSite.Name)")) {
Write-Host "$($WebSite.Name) was destroyed"
}
}
有了这个定义,任何调用Remote-Website cmdlet 的人现在都被要求确认他们确实想要销毁该站点。现在几乎没有任何生产网站被错误地破坏了,除了网络开发人员抱怨他们的自动化脚本已经停止工作。
我真正想要的是 cmdlet 的 ConfirmImpact 值在运行时根据网站类别的重要性而变化 - High 用于生产站点,Medium 用于测试站点和 @ 987654339@ 用于开发站点。下面的函数定义说明了这一点:
Function CategoryToImpact([string]$Category) {
Switch ($Category) {
'Production' {
[System.Management.Automation.ConfirmImpact]::High
break
}
'Test' {
[System.Management.Automation.ConfirmImpact]::Medium
break
}
'Development' {
[System.Management.Automation.ConfirmImpact]::Low
break
}
default {
[System.Management.Automation.ConfirmImpact]::None
break
}
}
}
Function Remove-WebSite {
[CmdletBinding(SupportsShouldProcess=$true<#,ConfirmImpact="Depends!"#>)]
Param(
[Parameter(Mandatory=$true)]
[WebSite] $WebSite
)
# This doesn't work but I hope it illustrates what I'd *like* to do
#$PSCmdLet.ConfirmImpact = CategoryToImpact($WebSite.Category)
if ($PSCmdlet.ShouldProcess("$($WebSite.Category) site $($WebSite.Name)")) {
Write-Host "$($WebSite.Name) was destroyed"
}
}
假设有可能,如何做到这一点?
这是一个完整的脚本和一些测试代码的粘贴:http://pastebin.com/kuk6HNm6
【问题讨论】:
-
你可以用
BEGIN{Switch($WebSite){{$_.Catagory -eq "High" -and $PSCmdlet.ShouldProcess("$($WebSite.Category) site $($WebSite.Name)"}{"$($WebSite.Name) was destroyed"};default {"$($WebSite.Name) was destroyed"}}代替你的If声明,这样如果影响不大就不会提示了
标签: powershell cmdlets powershell-5.0