Почему мой блок elseif запускается при указании -WhatIf

У меня небольшие проблемы с пониманием документации для 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 (я знаю, вроде как отвечает на мой вопрос), но я хочу посмотреть, есть ли в этом что-то еще. Кажется, все было бы наоборот.

Это просто дополнительный вариант для меня?

Может, я слишком много думаю об этом?


person Abraham Zinala    schedule 15.05.2021    source источник
comment
ShouldProcess всегда возвращает $false, когда присутствует -WhatIf - в этом вся суть, -WhatIf должен предотвращать выполнение ветвей с необратимыми побочными эффектами. Сообщение является побочным эффектом оценки условия — то, что происходит всегда (иначе как бы PowerShell узнал, входить в блок if или нет?)   -  person Mathias R. Jessen    schedule 15.05.2021
comment
Наличие $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
comment
Оооооооооооооооооооооооооооочень странно. Хотя имеет смысл! Если кто-то из вас хотел бы опубликовать в качестве ответа, я был бы рад принять. Спасибо, ребята, теперь я могу умереть спокойно. ржу не могу:)   -  person Abraham Zinala    schedule 15.05.2021