Question
WhatIf actif ou non
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 1 an 9 mois - il y a 1 an 9 mois #33030
par Laurent Dardenne
Tutoriels PowerShell
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 :C'est confus.
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
#>
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.
- laucaz
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 48
- Remerciements reçus 0
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 :
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
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.
- laucaz
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 48
- Remerciements reçus 0
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 :
Si tu as des remarques n'hesites pas.
En tous cas merci pour tes conseils
Laurent (moi aussi )
# 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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 1 an 9 mois #33035
par Laurent Dardenne
Tutoriels PowerShell
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:Il me semble qu'ici l'usage du paramètre Whatif regroupe deux comportements : une simulation de traitement et une confirmation d'un traitement.
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
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- laucaz
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 48
- Remerciements reçus 0
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
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 1 an 9 mois #33039
par Laurent Dardenne
Tutoriels PowerShell
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: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).
>>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:
Comme ceci :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.
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
#>
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
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- WhatIf actif ou non