web-dev-qa-db-fra.com

Comment utiliser -confirm dans PowerShell

J'essaie de prendre les entrées des utilisateurs et avant de continuer, j'aimerais avoir un message à l'écran, puis une confirmation, que l'utilisateur veuille ou non continuer. J'utilise le code suivant mais ça ne marche pas:

write-Host "Are you Sure You Want To Proceed:"  -Confirm
30
user3770612

-Confirm est un commutateur de la plupart des cmdlets PowerShell qui oblige la cmdlet à demander la confirmation de l'utilisateur. Ce que vous recherchez réellement est le Read-Host cmdlet:

$confirmation = Read-Host "Are you Sure You Want To Proceed:"
if ($confirmation -eq 'y') {
  # proceed
}

ou la méthode PromptForChoice() de l'interface utilisateur de l'hôte:

$message  = 'something'
$question = 'Are you sure you want to proceed?'

$choices = New-Object Collections.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription]
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Yes'))
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&No'))

$decision = $Host.UI.PromptForChoice($message, $question, $choices, 1)
if ($decision -eq 0) {
  Write-Host 'confirmed'
} else {
  Write-Host 'cancelled'
}
73
Ansgar Wiechers

Il s’agit d’une simple boucle qui reste incitée à moins que l’utilisateur sélectionne "y" ou "n"

$confirmation = Read-Host "Ready? [y/n]"
while($confirmation -ne "y")
{
    if ($confirmation -eq 'n') {exit}
    $confirmation = Read-Host "Ready? [y/n]"
}
12
dallyack

Read-Host est un exemple d'applet de commande sur laquelle -Confirm n'a aucun effet .-Confirm est l'un des paramètres communs de PowerShell, en particulier un paramètre d'atténuation des risques utilisé lors de la modification du système en dehors de Windows Environnement PowerShell. De nombreuses applets de commande, mais pas toutes, prennent en charge le paramètre d'atténuation des risques -Confirm.

En guise d'alternative, voici un exemple d'utilisation de la cmdlet Read-Host et d'un test d'expression régulière pour obtenir la confirmation d'un utilisateur:

$reply = Read-Host -Prompt "Continue?[y/n]"
if ( $reply -match "[yY]" ) { 
    # Highway to the danger zone 
}

La cmdlet Remove-Variable est un exemple illustrant l'utilisation du commutateur -confirm.

Remove-Variable 'reply' -Confirm

Références supplémentaires: CommonParameters , Write-Host , Read-Host , Opérateurs de comparaison , Expressions régulières , Remove-Variable

8
Chris Smith

write-Host n'a pas de paramètre -confirm.

Vous pouvez faire quelque chose comme ça à la place:

    $caption = "Please Confirm"    
    $message = "Are you Sure You Want To Proceed:"
    [int]$defaultChoice = 0
    $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Do the job."
    $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Do not do the job."
    $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)
    $choiceRTN = $Host.ui.PromptForChoice($caption,$message, $options,$defaultChoice)

if ( $choiceRTN -ne 1 )
{
   "Your Choice was Yes"
}
else
{
   "Your Choice was NO"
}
6
CB.

Voici une solution que j'ai utilisée, semblable à la solution Ansgar Wiechers;

$title = "Lorem"
$message = "Ipsum"

$yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "This means Yes"
$no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "This means No"

$options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)

$result = $Host.ui.PromptForChoice($title, $message, $Options, 0)

Switch ($result)
     {
          0 { "You just said Yes" }
          1 { "You just said No" }
     }
2
samprog

Pour quand vous voulez un 1-liner

while( -not ( ($choice= (Read-Host "May I continue?")) -match "y|n")){ "Y or N ?"}
2
Chris F Carroll

Une fonction légèrement plus jolie basée sur Réponse de Ansgar Wiechers . Que ce soit plus utile ou non, fait l’objet d’un débat.

function Read-Choice(
   [Parameter(Mandatory)][string]$Message,
   [Parameter(Mandatory)][string[]]$Choices,
   [Parameter(Mandatory)][string]$DefaultChoice,
   [Parameter()][string]$Question='Are you sure you want to proceed?'
) {
    $defaultIndex = $Choices.IndexOf($DefaultChoice)
    if ($defaultIndex -lt 0) {
        throw "$DefaultChoice not found in choices"
    }

    $choiceObj = New-Object Collections.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription]

    foreach($c in $Choices) {
        $choiceObj.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList $c))
    }

    $decision = $Host.UI.PromptForChoice($Message, $Question, $choiceObj, $defaultIndex)
    return $Choices[$decision]
}

Exemple d'utilisation:

PS> $r = Read-Choice 'DANGER!!!!!!' '&Apple','&blah','&car' '&blah'

DANGER!!!!!!
Are you sure you want to proceed?
[A] Apple  [B] blah  [C] car  [?] Help (default is "B"): c
PS> switch($r) { '&car' { Write-Host 'caaaaars!!!!' } '&blah' { Write-Host "It's a blah day" } '&Apple' { Write-Host "I'd like to eat some apples!" } }
caaaaars!!!!
1
jpmc26

Voici la documentation de Microsoft sur la procédure à suivre pour demander des confirmations dans une applet de commande. Les exemples sont en C #, mais vous pouvez également faire tout ce qui est montré dans PowerShell.

Ajoutez d’abord l’attribut CmdletBinding à votre fonction et définissez SupportsShouldProcess sur true. Ensuite, vous pouvez référencer les méthodes ShouldProcess et ShouldContinue de la variable $PSCmdlet.

Voici un exemple:

function Start-Work {
    <#
    .SYNOPSIS Does some work
    .PARAMETER Force
        Perform the operation without prompting for confirmation
    #>
    [CmdletBinding(SupportsShouldProcess=$true)]
    param(
        # This switch allows the user to override the Prompt for confirmation
        [switch]$Force
    )
    begin { }
    process {
        if ($PSCmdlet.ShouldProcess('Target')) {
            if (-not ($Force -or $PSCmdlet.ShouldContinue('Do you want to continue?', 'Caption'))) {
                return # user replied no
            }

            # Do work
        }

    }
    end { }
}
1
Zack Bolin