Question
[Résolu] Switch via fonction
- PatriceLT
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 98
- Remerciements reçus 2
il y a 5 ans 1 mois #28540
par PatriceLT
[Résolu] Switch via fonction a été créé par PatriceLT
Bonjour,
Je souhaiterai avoir de l'aide sur un problème que j'ai actuellement.
J'ai un script fonctionnel, mais qui nécessite du copier coller dans mes switchs pour les différents choix que l'utilisateur fera.
Pour cela, j'aurai souhaité savoir si il était possible d'avoir une fonction générique, et pour chaque choix que l'utilisateur fera via le switch, la fonction sera appelé et mettra les variables appropriées en place.
Voici une partie de mon code (un choix entier du switch) mais qui se répète pour les différents environnements.
[code:1]
#====================[Variables]====================#
#=====[Date]=====#
$Date = Get-Date -Format (\"yyyy-MM-dd\"«»)
#=====[Fichiers]=====#
$LocalChemin = \"C:\temp\PatchManagement\"
$RemoteChemin = \"C:\temp\\"
#==[Path Script]==#
# Return Script #
$Pilotage = \"$LocalChemin\PilotagePatch.ps1\"
# Bits Transfert & Task #
$LocalScript = \"$LocalChemin\DeploiementPatch.ps1\"
$RemoteScript = \"C:\temp\DeploiementPatch.ps1\"
Function Menu{
clear
Write-Host \"#=========================#\"
Write-Host \"# Menu Principal #\"
Write-Host \"#=========================#\"
Write-Host \"# '1' : dev-re7 #\"
Write-Host \"# #\"
Write-Host \"# '2' : PPROD #\"
Write-Host \"# #\"
Write-Host \"# '3' : PROD #\"
Write-Host \"# #\"
Write-Host \"# 'q' : Quitter #\"
Write-Host \"#=========================#\"
Write-Host \"\"
}
Function SousMenu{
param(
[string]$Title
)
clear
Write-Host \"\"
Write-Host \"#====================[ $Title ]====================# \"
Write-Host \"\"
Write-Host \"'1' : Test des Flux\"
Write-Host \"\"
Write-Host \"'2' : Copie du script $LocalScript\"
Write-Host \"\"
Write-Host \"'3' : Création de la tache planifiée\"
Write-Host \"\"
Write-Host \"'4' : Lancement de la tache planifiée\"
Write-Host \"\"
Write-Host \"'5' : Supprimer la tache planifiée\"
Write-Host \"\"
Write-Host \"'q' : Quitter\"
Write-Host \"\"
Write-Host \"\"
}
#====================[Traitement]====================#
#==========[Switch]==========#
$ChoixMenu = $null
Menu
$ChoixMenu = Read-Host \"Périmètre \"
Switch($ChoixMenu)
{
\"1\" # Environnement de Dev et de Recette #
{
SousMenu -Title \"1 : dev-re7\"
$Choix1 = Read-Host \"Renseigner l'environnement \"
Switch($Choix1)
{
\"1\" # Test des flux#
{
$Log_f_file = \"$CheminLogs\OK_dev-re7_Test-Flux_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_dev-re7_Test-Flux_Log_$Date.txt\"
if(!(Test-Path $DevRe7FichierServeur)) {
Logs_r \"[ERREUR] Aucun fichier `\"$DevRe7FichierServeur`\" n'est présent.\" \"Red\"
Logs_r \" \"
sleep 5
& $Pilotage
}
else{
Log_f \"[OK] Fichier `\"$DevRe7FichierServeur`\" présent.\" \"Green\"
Log_f \" \"
foreach($Serveur in $ImportFichierCsvDevRe7){
if((TestConnect -ComputerName $Serveur) -eq \"True\"«»){
Log_f \" \"
Log_f \"[DEV-RE7];[CONNEXION];$($Serveur);OK\" \"Green\"
Log_f \" \"
if(Invoke-Command -ComputerName $Serveur -ScriptBlock {Get-Service | Where-Object {($_.Name -eq \"WinRM\"«») -and ($_.Status -eq \"Running\"«»)}}){
Log_f \" \"
Log_f \"[DEV-RE7];[WINRM];$($Serveur);OK\" \"Green\"
Log_f \" \"
}
else{
Logs_r \" \"
Logs_r \"[DEV-RE7];[WINRM];$($Serveur);NOK\" \"Red\"
Logs_r \" \"
}
}
else{
Logs_r \" \"
Logs_r \"[DEV-RE7];[CONNEXION];$($Serveur);NOK\"
Logs_r \" \"
}
}
}
}
\"2\" # Copie Fichier PM #
{
$Log_f_file = \"$CheminLogs\OK_prod_CopieFile_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_prod_CopieFile_Log_$Date.txt\"
foreach($Serveur in $ImportFichierCsvPROD)
{
if(Test-Path \"\\$Serveur\C$\Temp\"«»)
{
if(Test-Path $LocalScript)
{
Log_f \"[BITSTRANSFER] Copie du fichier `\"$LocalScript`\" vers `\"\\$Serveur\C$\Temp`\"\"
Log_f \" \"
Start-BitsTransfer $LocalScript -Destination \"\\$Serveur\C$\Temp\"
if(Test-Path \"\\$Serveur\C$\Temp\DeploiementPatch.ps1\"«»)
{
Log_f \"[BITSTRANSFER];$($Serveur);OK\" \"Green\"
Log_f \" \"
}
else
{
Logs_r \"[BITSTRANSFER];$($Serveur);NOK\" \"Red\"
Logs_r \" \"
}
}
else
{
Logs_r \"[FICHIER] $($LocalScript) n'existe pas\"
}
}
elseif(New-Item -Path \"\\$Serveur\C$\" -Name \"Temp\" -ItemType Directory)
{
Log_f \" \"
Log_f \"[TEMP] Création du dossier temp sur $($Serveur)\"
start-sleep 2
Log_f \" \"
}
else
{
Logs_r \" \"
Logs_r \"[TEMP] Impossible de créer le dossier temp sur $($Serveur)\"
Logs_r \"[TEMP] OU\"
Logs_r \"[TEMP] Impossible d'accéder à $($Serveur)\"
Logs_r \" \"
}
}
}
\"3\" # Création de la tache planifiée #
{
$Log_f_file = \"$CheminLogs\OK_prod_CreateTask_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_prod_CreateTask_Log_$Date.txt\"
foreach($Serveur in $ImportFichierCsvPROD){
if(Invoke-Command -ComputerName $Serveur -ScriptBlock { `
$TacheGeneralNom = \"Patch Management - Wsus\"
$TacheGeneralDescription = \"WSUS\"
$TacheActionProgramme = \"powershell.exe\"
$TacheActionCheminArg = \"C:\temp\DeploiementPatch.ps1\"
$TacheActionArguments = \"-Executionpolicy Bypass -file $TacheActionCheminArg\"
$ServiceObjet = New-Object -ComObject(\"Schedule.Service\"«»)
$ServiceObjet.Connect()
$TacheChemin = $ServiceObjet.GetFolder(\"\\"«»)
$TacheDefinition = $ServiceObjet.NewTask(0) # Doit-Être à 0
$TacheDefinition.RegistrationInfo.Description = \"$TacheGeneralDescription\"
$TacheDefinition.Settings.Enabled = $True
$TacheDefinition.Principal.RunLevel = 1
$Triggers = $TacheDefinition.Triggers
$Action = $TacheDefinition.Actions.Create(0)
$Action.Path = $TacheActionProgramme
$Action.Arguments = $TacheActionArguments
$TacheChemin.RegisterTaskDefinition($TacheGeneralNom,$TacheDefinition,6,\"System\",$null,5)`
})
{
Log_f \"[CREATE-TASK];$($Serveur);OK\"
}
else{
Logs_r \"[CREATE-TASK];$($Serveur);NOK\"
}
}
}
\"4\" # Lancement de la tache planifiée #
{
$Log_f_file = \"$CheminLogs\OK_dev-re7_LaunchTask_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_dev-re7_LaunchTask_Log_$Date.txt\"
foreach($Serveur in $ImportFichierCsvDevRe7){
if(Invoke-Command -ComputerName $Serveur -ScriptBlock {schtasks /Run /tn \"Patch Management - Wsus\"}){
Log_f \"[LANCEMENT-TASK];$($Serveur);OK\"
}
else{
Logs_r \"[LANCEMENT-TASK];$($Serveur);NOK\"
}
}
}
\"5\" # suppression de la tache planifiée
{
$Log_f_file = \"$CheminLogs\OK_dev-re7_DeleteTask_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_dev-re7_DeleteTask_Log_$Date.txt\"
foreach($Serveur in $ImportFichierCsvDevRe7){
if(Invoke-Command -ComputerName $Serveur -ScriptBlock {schtasks /delete /tn \"Patch Management - Wsus\" /f}){
Log_f \"[DELETE-TASK];$($Serveur);OK\"
}
else{
Logs_r \"[DELETE-TASK];$($Serveur);NOK\"
}
}
}
\"q\" # quitter le script
{
break
}
}
}
}
[/code:1]
Ce code est donc récurrent pour la partie PPROD et PROD
Merci d'avance pour votre aide<br><br>Message édité par: Arnaud, à: 3/04/19 09:21
Je souhaiterai avoir de l'aide sur un problème que j'ai actuellement.
J'ai un script fonctionnel, mais qui nécessite du copier coller dans mes switchs pour les différents choix que l'utilisateur fera.
Pour cela, j'aurai souhaité savoir si il était possible d'avoir une fonction générique, et pour chaque choix que l'utilisateur fera via le switch, la fonction sera appelé et mettra les variables appropriées en place.
Voici une partie de mon code (un choix entier du switch) mais qui se répète pour les différents environnements.
[code:1]
#====================[Variables]====================#
#=====[Date]=====#
$Date = Get-Date -Format (\"yyyy-MM-dd\"«»)
#=====[Fichiers]=====#
$LocalChemin = \"C:\temp\PatchManagement\"
$RemoteChemin = \"C:\temp\\"
#==[Path Script]==#
# Return Script #
$Pilotage = \"$LocalChemin\PilotagePatch.ps1\"
# Bits Transfert & Task #
$LocalScript = \"$LocalChemin\DeploiementPatch.ps1\"
$RemoteScript = \"C:\temp\DeploiementPatch.ps1\"
Function Menu{
clear
Write-Host \"#=========================#\"
Write-Host \"# Menu Principal #\"
Write-Host \"#=========================#\"
Write-Host \"# '1' : dev-re7 #\"
Write-Host \"# #\"
Write-Host \"# '2' : PPROD #\"
Write-Host \"# #\"
Write-Host \"# '3' : PROD #\"
Write-Host \"# #\"
Write-Host \"# 'q' : Quitter #\"
Write-Host \"#=========================#\"
Write-Host \"\"
}
Function SousMenu{
param(
[string]$Title
)
clear
Write-Host \"\"
Write-Host \"#====================[ $Title ]====================# \"
Write-Host \"\"
Write-Host \"'1' : Test des Flux\"
Write-Host \"\"
Write-Host \"'2' : Copie du script $LocalScript\"
Write-Host \"\"
Write-Host \"'3' : Création de la tache planifiée\"
Write-Host \"\"
Write-Host \"'4' : Lancement de la tache planifiée\"
Write-Host \"\"
Write-Host \"'5' : Supprimer la tache planifiée\"
Write-Host \"\"
Write-Host \"'q' : Quitter\"
Write-Host \"\"
Write-Host \"\"
}
#====================[Traitement]====================#
#==========[Switch]==========#
$ChoixMenu = $null
Menu
$ChoixMenu = Read-Host \"Périmètre \"
Switch($ChoixMenu)
{
\"1\" # Environnement de Dev et de Recette #
{
SousMenu -Title \"1 : dev-re7\"
$Choix1 = Read-Host \"Renseigner l'environnement \"
Switch($Choix1)
{
\"1\" # Test des flux#
{
$Log_f_file = \"$CheminLogs\OK_dev-re7_Test-Flux_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_dev-re7_Test-Flux_Log_$Date.txt\"
if(!(Test-Path $DevRe7FichierServeur)) {
Logs_r \"[ERREUR] Aucun fichier `\"$DevRe7FichierServeur`\" n'est présent.\" \"Red\"
Logs_r \" \"
sleep 5
& $Pilotage
}
else{
Log_f \"[OK] Fichier `\"$DevRe7FichierServeur`\" présent.\" \"Green\"
Log_f \" \"
foreach($Serveur in $ImportFichierCsvDevRe7){
if((TestConnect -ComputerName $Serveur) -eq \"True\"«»){
Log_f \" \"
Log_f \"[DEV-RE7];[CONNEXION];$($Serveur);OK\" \"Green\"
Log_f \" \"
if(Invoke-Command -ComputerName $Serveur -ScriptBlock {Get-Service | Where-Object {($_.Name -eq \"WinRM\"«») -and ($_.Status -eq \"Running\"«»)}}){
Log_f \" \"
Log_f \"[DEV-RE7];[WINRM];$($Serveur);OK\" \"Green\"
Log_f \" \"
}
else{
Logs_r \" \"
Logs_r \"[DEV-RE7];[WINRM];$($Serveur);NOK\" \"Red\"
Logs_r \" \"
}
}
else{
Logs_r \" \"
Logs_r \"[DEV-RE7];[CONNEXION];$($Serveur);NOK\"
Logs_r \" \"
}
}
}
}
\"2\" # Copie Fichier PM #
{
$Log_f_file = \"$CheminLogs\OK_prod_CopieFile_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_prod_CopieFile_Log_$Date.txt\"
foreach($Serveur in $ImportFichierCsvPROD)
{
if(Test-Path \"\\$Serveur\C$\Temp\"«»)
{
if(Test-Path $LocalScript)
{
Log_f \"[BITSTRANSFER] Copie du fichier `\"$LocalScript`\" vers `\"\\$Serveur\C$\Temp`\"\"
Log_f \" \"
Start-BitsTransfer $LocalScript -Destination \"\\$Serveur\C$\Temp\"
if(Test-Path \"\\$Serveur\C$\Temp\DeploiementPatch.ps1\"«»)
{
Log_f \"[BITSTRANSFER];$($Serveur);OK\" \"Green\"
Log_f \" \"
}
else
{
Logs_r \"[BITSTRANSFER];$($Serveur);NOK\" \"Red\"
Logs_r \" \"
}
}
else
{
Logs_r \"[FICHIER] $($LocalScript) n'existe pas\"
}
}
elseif(New-Item -Path \"\\$Serveur\C$\" -Name \"Temp\" -ItemType Directory)
{
Log_f \" \"
Log_f \"[TEMP] Création du dossier temp sur $($Serveur)\"
start-sleep 2
Log_f \" \"
}
else
{
Logs_r \" \"
Logs_r \"[TEMP] Impossible de créer le dossier temp sur $($Serveur)\"
Logs_r \"[TEMP] OU\"
Logs_r \"[TEMP] Impossible d'accéder à $($Serveur)\"
Logs_r \" \"
}
}
}
\"3\" # Création de la tache planifiée #
{
$Log_f_file = \"$CheminLogs\OK_prod_CreateTask_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_prod_CreateTask_Log_$Date.txt\"
foreach($Serveur in $ImportFichierCsvPROD){
if(Invoke-Command -ComputerName $Serveur -ScriptBlock { `
$TacheGeneralNom = \"Patch Management - Wsus\"
$TacheGeneralDescription = \"WSUS\"
$TacheActionProgramme = \"powershell.exe\"
$TacheActionCheminArg = \"C:\temp\DeploiementPatch.ps1\"
$TacheActionArguments = \"-Executionpolicy Bypass -file $TacheActionCheminArg\"
$ServiceObjet = New-Object -ComObject(\"Schedule.Service\"«»)
$ServiceObjet.Connect()
$TacheChemin = $ServiceObjet.GetFolder(\"\\"«»)
$TacheDefinition = $ServiceObjet.NewTask(0) # Doit-Être à 0
$TacheDefinition.RegistrationInfo.Description = \"$TacheGeneralDescription\"
$TacheDefinition.Settings.Enabled = $True
$TacheDefinition.Principal.RunLevel = 1
$Triggers = $TacheDefinition.Triggers
$Action = $TacheDefinition.Actions.Create(0)
$Action.Path = $TacheActionProgramme
$Action.Arguments = $TacheActionArguments
$TacheChemin.RegisterTaskDefinition($TacheGeneralNom,$TacheDefinition,6,\"System\",$null,5)`
})
{
Log_f \"[CREATE-TASK];$($Serveur);OK\"
}
else{
Logs_r \"[CREATE-TASK];$($Serveur);NOK\"
}
}
}
\"4\" # Lancement de la tache planifiée #
{
$Log_f_file = \"$CheminLogs\OK_dev-re7_LaunchTask_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_dev-re7_LaunchTask_Log_$Date.txt\"
foreach($Serveur in $ImportFichierCsvDevRe7){
if(Invoke-Command -ComputerName $Serveur -ScriptBlock {schtasks /Run /tn \"Patch Management - Wsus\"}){
Log_f \"[LANCEMENT-TASK];$($Serveur);OK\"
}
else{
Logs_r \"[LANCEMENT-TASK];$($Serveur);NOK\"
}
}
}
\"5\" # suppression de la tache planifiée
{
$Log_f_file = \"$CheminLogs\OK_dev-re7_DeleteTask_Log_$Date.txt\"
$Logs_r_file = \"$CheminLogs\NOK_dev-re7_DeleteTask_Log_$Date.txt\"
foreach($Serveur in $ImportFichierCsvDevRe7){
if(Invoke-Command -ComputerName $Serveur -ScriptBlock {schtasks /delete /tn \"Patch Management - Wsus\" /f}){
Log_f \"[DELETE-TASK];$($Serveur);OK\"
}
else{
Logs_r \"[DELETE-TASK];$($Serveur);NOK\"
}
}
}
\"q\" # quitter le script
{
break
}
}
}
}
[/code:1]
Ce code est donc récurrent pour la partie PPROD et PROD
Merci d'avance pour votre aide<br><br>Message édité par: Arnaud, à: 3/04/19 09:21
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 5 ans 1 mois #28541
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:Switch via fonction
Bonjour Patrice,
Oui tu bien sûr tu peux créer une fonction que tu réutiliseras plusieurs fois dans ton switch. C'est même une bonne pratique de le faire, car cela va donner plus de lisibilité à ton code, et factoriser le code c'est bien aussi !
Arnaud
Oui tu bien sûr tu peux créer une fonction que tu réutiliseras plusieurs fois dans ton switch. C'est même une bonne pratique de le faire, car cela va donner plus de lisibilité à ton code, et factoriser le code c'est bien aussi !
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- PatriceLT
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 98
- Remerciements reçus 2
il y a 5 ans 1 mois #28546
par PatriceLT
Réponse de PatriceLT sur le sujet Re:Switch via fonction
Merci arnaud pour ton commentaire
J'en suis conscient, mais le problème c'est comment le mettre en place pour factoriser le script...
J'ai un peu de mal avec les fonctions complexes et surtout les fonctions qui factorisent le code.
Aurais-tu une piste, ou eventuellement un bout de code à me proposer ?
J'en suis conscient, mais le problème c'est comment le mettre en place pour factoriser le script...
J'ai un peu de mal avec les fonctions complexes et surtout les fonctions qui factorisent le code.
Aurais-tu une piste, ou eventuellement un bout de code à me proposer ?
Connexion ou Créer un compte pour participer à la conversation.
- PatriceLT
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 98
- Remerciements reçus 2
il y a 5 ans 4 semaines #28589
par PatriceLT
Réponse de PatriceLT sur le sujet Re:Switch via fonction
J'ai finalement trouvé :
Création des fonctions par action.
Appel de chaque fonction dépendante dans la fonction de sortie.
Par exemple la copyfile doit être faite avant la create task, du coup, j'appel la copyfile au début, puis je test si c'est retour ok, alors je créé ma tâche planifié
Si j'ai le temps, je mettrai le code complet afin d'en aider d'autre si besoin.
Création des fonctions par action.
Appel de chaque fonction dépendante dans la fonction de sortie.
Par exemple la copyfile doit être faite avant la create task, du coup, j'appel la copyfile au début, puis je test si c'est retour ok, alors je créé ma tâche planifié
Si j'ai le temps, je mettrai le code complet afin d'en aider d'autre si besoin.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.077 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- [Résolu] Switch via fonction