Question [Résolu] Switch via fonction

Plus d'informations
il y a 5 ans 1 mois #28540 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

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

Plus d'informations
il y a 5 ans 1 mois #28541 par Arnaud Petitjean
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

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.

Plus d'informations
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 ?

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

Plus d'informations
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.

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

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