Question WhatIf actif ou non

Plus d'informations
il y a 1 an 9 mois - il y a 1 an 9 mois #33030 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet WhatIf actif ou non
Un exemple de code ( juste la structure) serait bienvenue.

j'ai testé ceci :
  [CmdletBinding(SupportsShouldProcess)]
   param( $name)

 function Test {
  [CmdletBinding(SupportsShouldProcess)]
   param( $name)

     $name
    $psboundparameters

     if ($PSCmdlet.ShouldProcess($name)) 
     { Write-Host "Whatif absent. On désactive." }
     else
     { Write-Host "Whatif present.On ne désactive pas." }
 }

  if ($PSCmdlet.ShouldProcess($name)) 
  { $DesactiveWhatif=$true }
  else
  { $DesactiveWhatif=$false }

  Test -Name 'Nom' -Whatif:$DesactiveWhatif

<#
.\What.ps1 'Nom' 
.\What.ps1 'Nom' -Whatif
.\What.ps1 'Nom' -Whatif:$false
#>
C'est confus.

Tutoriels PowerShell
Dernière édition: il y a 1 an 9 mois par Laurent Dardenne.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 an 9 mois #33031 par laucaz
Réponse de laucaz sur le sujet WhatIf actif ou non
Je pense que l'AST (je viens de faire quelques tests) repond bien à mon idée.

Sinon un extrait de mon code, la où je mets un WhatIf pour eviter l'accident :
########################################################################################
#Suppression des repertoires profils [prefixe-][matricule][-old] trouvés sur le serveur#
########################################################################################

        foreach ($profil in $RepARech){
                                   
                                   Remove-Item -path $profil -recurse -force -verbose -WhatIf
                                   

                                    write-host "le repertoire $profil a été supprimé"


                                            }


        $bilan = "les répertoires profils pour les comptes '$PrefixeCpte' sur le '$srv' et  suffixé en -Old ont été supprimés"

        #alimentation du log#
        $bilan  | Out-File $logSortie -Append
        $RepARech | Out-File $logSortie -Append
        $espace2| Out-File $logSortie -Append
        Write-Host "les répertoires profils pour les comptes '$PrefixeCpte' sur le '$srv' et  suffixé en -Old ont été supprimés" -ForegroundColor Green
        write-host $espace2

Avec l'AST je recupere bien  mes parametres actifs " -recurse -force -verbose -WhatIf" et si je pose un "#" devant le "-WhatIf", il disparait des "actifs".
Donc ça repond bien à mon idée. Maintenant à moi de travailler pour l'ajouter à mon script et le generaliser sur mes scripts  qui ont une action potentiellement "sensibles" ;-)
  
Et merci pour ton exemple de code :-)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 an 9 mois #33033 par laucaz
Réponse de laucaz sur le sujet WhatIf actif ou non
Laurent, je crois avoir trouvé ma solution. Il reste à l'integrer proprement et à tester mais c'est assez proche de ce que j'attends :
# le code à evaluer
$code = @'
        foreach ($profil in $RepARech){                                  
                                   Remove-Item -path $profil -recurse -force -verbose #-WhatIf
                                   
                                    write-host "le repertoire $profil a été supprimé"

                                            }
'@

#definition des variables necessaires à AST
$AST = [System.Management.Automation.Language.Parser]::ParseInput($code, [ref]$null, [ref]$null)

# Type d'object que AST doit renvoyer
$predicate = {param($astObject) $astObject -is [System.Management.Automation.Language.CommandParameterAst] }

# recherche recursive dans le code
$recurse = $true

#parcours du code et enregistrement de ce qu'on cherche dans une variable
$variable = $AST.FindAll($predicate, $recurse)

# recuperation uniquement des parametres
$AST.FindAll({ param($astObject) $astObject -is [System.Management.Automation.Language.ParameterAst] }, $true )

# affichage à l'ecran pour controle
write-host $variable

 if (($variable).ParameterName -like 'WhatIf') {
                                 Write-Host "WhatIf est actif"
                                               }
                                           else
                                               {
                                 Write-Host "WhatIf est desactivé"
                                               }



Si tu as des remarques n'hesites pas. 
En tous cas merci pour tes conseils
Laurent (moi aussi ;) )

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 an 9 mois #33035 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet WhatIf actif ou non
>>Si tu as des remarques n'hésites pas.
Si c'est à l'utilisateur d'indiquer l'intention ce n'est pas au code de le faire.

>> je précise que pour que le script effectue vraiment son action il faut désactiver ce paramètre.
La solution est donc dans la ligne d'appel, IL étant l'utilisateur/trice.

Je trouve l'usage de l'AST inadapté ici, si on doit analyser le code pour le modifier ou pour changer le comportement autant utiliser un paramètre:
-Whatif:$DesactiveWhatif
Il me semble qu'ici l'usage du paramètre Whatif regroupe deux comportements : une simulation de traitement et une confirmation d'un traitement.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 an 9 mois - il y a 1 an 9 mois #33036 par laucaz
Réponse de laucaz sur le sujet WhatIf actif ou non
tu as sans doute raison, je vais revoir cela ;-)

En revanche, je ne comprends pas bien le fonctionnement de ton "-WhatIf:$desactiveWhatIf" ?, est-ce une fonction que tu crés pour desactiver le WhatIf ?  

Meci pour tes remarques
Dernière édition: il y a 1 an 9 mois par laucaz.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 an 9 mois #33039 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet WhatIf actif ou non
>> je ne comprends pas bien le fonctionnement de ton "-WhatIf:$desactiveWhatIf" ?
>>Est-ce une fonction que tu crés pour desactiver le WhatIf ?
Non, c'est une variable booléenne qui propage une valeur ($true ou $false), on peut préciser un switch mais indiquer qu'on le désactive.

Je pense que le paramètre -Force est candidat au comportement que tu recherches:

Implement this parameter to indicate that the user can perform an action even if restrictions are encountered when the parameter is specified. The parameter does not allow security to be compromised. For example, this parameter lets a user overwrite a read-only file.

Comme ceci :
   param( 
    $Name,
    [Switch]$Force
   )

 function Test {
  [CmdletBinding(SupportsShouldProcess)]
   param( $name)

     if ($PSCmdlet.ShouldProcess($name)) 
     { Write-Host "Whatif absent. On effectue le traitement." }
     else
     { Write-Host "Whatif présent.On simule le traitement." }
 }

   #Si -Force on désactive Whatif, en inversant la valeur du boolean
   #$Whatif:$False exécute le traitement

  $DesactiveWhatif=-not $Force.isPresent
  Test -Name 'Nom' -Whatif:$DesactiveWhatif

<#
.\What.ps1 'Nom' 
.\What.ps1 'Nom' -Force
.\What.ps1 'Nom' -Force:$false
#>
Ce qui me semble similaire à l'usage de -Force sur Add-Member.
Il faut tout de même tester cette approche pour des scénarios où la portée influence le comportement du whatif (cf. module).

Tutoriels PowerShell
Les utilisateur(s) suivant ont remercié: laucaz

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.130 secondes
Propulsé par Kunena