Я пишу командлет Powershell, который поддерживает ShouldProcess
. Вместо фиксированного значения ConfirmImpact
мне нужно «динамическое» значение, которое зависит от значения параметра, переданного командлету. Позвольте мне проиллюстрировать это примером.
Давайте представим, что я провайдер веб-хостинга. У меня много веб-сайтов, и каждый веб-сайт принадлежит к одной из следующих категорий, упорядоченных по важности: Production
, Test
и Development
. В рамках управления хостингом у меня есть командлет Remove-WebSite
для уничтожения веб-сайтов. Следующий код иллюстрирует это:
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"
}
На данный момент сайты уничтожаются без подтверждения. Хотя это удобно, слишком много стажеров по ошибке уничтожали производственные сайты, поэтому я хотел бы немного больше подстраховки в командлете Remove-WebSite
, воспользовавшись преимуществами ShouldProcess функции Powershell.
Поэтому я добавляю значения SupportsShouldProcess
и ConfirmImpact
к атрибуту CmdletBinding
. Мое определение командлета становится следующим:
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
, теперь просят подтвердить, что он действительно хочет уничтожить сайт. Вряд ли какие-либо производственные сайты сейчас уничтожаются по ошибке, за исключением того, что веб-разработчики жалуются на то, что их автоматизированные скрипты перестали работать.
Мне бы очень хотелось, чтобы значение ConfirmImpact
для командлета менялось во время выполнения в зависимости от важности категории веб-сайта — High
для рабочих сайтов, Medium
для тестовых сайтов и Low
для сайтов разработки. Это иллюстрирует следующее определение функции:
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
утверждения, поэтому, если влияние невелико, оно не будет запрашивать - person TheMadTechnician   schedule 27.05.2016