У меня небольшие проблемы с пониманием документации для SupportsShouldProcess, и я искал, может ли кто-нибудь разобрать его немного подробнее, чтобы я понял.
Используемые ссылки
Текущий код
Function Test-ShouldProcess{
[CmdletBinding(SupportsShouldProcess)]
Param(
[Parameter(Mandatory=$false,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[String[]]$Path = "C:\Users\Abraham\Desktop\FileToDelete.txt",
[String[]]$ComputerName = $env:COMPUTERNAME
)
Begin{
$File = Get-Item -Path $Path
}
Process{
foreach($Computer in $ComputerName){
try {
#$PSSession = New-PSSession -ComputerName $Computer -ErrorAction Stop
if($PSCmdlet.ShouldProcess($Computer, "Removing: $File")){
"$($file.Name) deleted"
}
elseif ($WhatIfPreference.IsPresent) {
"Why does my what if switch go here?"
}
} catch [System.Management.Automation.Remoting.PSRemotingTransportException] {
"Unable to connect to $computer"
"Error: $($error[0].Exception.Message.Split(':')[1].Trim())"
}
}
}
}
Вопрос
В моем блоке Process{}
у меня есть условия if()
и elseif()
, чтобы проверить, было ли указано -Whatif
.
Test-ShouldProcess -WhatIf
Мне трудно понять, почему мой оператор elseif()
запускается при указании -WhatIf
, но я получаю сообщение в моем первом условии if()
:
Что если: Выполнение операции Удаление: C:\Users\Abraham\Desktop\FileToDelete.txt.FullName на целевом DESKTOP-OEREJ77.
... тем не менее, он не запускает код в этом блоке только в моем elseif
. Не будет ли наоборот?
Я знаю, что я явно говорю ему запускать этот раздел, если указан -WhatIf
(я знаю, вроде как отвечает на мой вопрос), но я хочу посмотреть, есть ли в этом что-то еще. Кажется, все было бы наоборот.
Это просто дополнительный вариант для меня?
Может, я слишком много думаю об этом?
ShouldProcess
всегда возвращает$false
, когда присутствует-WhatIf
- в этом вся суть,-WhatIf
должен предотвращать выполнение ветвей с необратимыми побочными эффектами. Сообщение является побочным эффектом оценки условия — то, что происходит всегда (иначе как бы PowerShell узнал, входить в блокif
или нет?) - person Mathias R. Jessen   schedule 15.05.2021$PSCmdlet.ShouldProcess
гарантирует, что вы получите сообщение от-WhatIf
, но сам блокif
никогда не оценивается как true и не выполняется. Единственным верным условием являетсяelseif
, где вы добавили проверку того, соответствует ли$WhatIfPreference.IsPresent
. Это создает иллюзию того, что работают оба блока, но это не так, как никогда не бывает сif/elseif/else
. См.$a = 1; if ($a -eq 1) { "Y" } elseif ($a -eq 1) { "ELSEIF" } else { "Nothing to see here" }
- person Ash   schedule 15.05.2021