Commun/VegaShellCommun.ps1
function TryCatchError { <# .SYNOPSIS Cette fonction sert à sortir une erreur dans un try catch avec plusieurs possibilitées comme <br>1 continuer malgré l'erreur avec [switch]continue <br>2 modifier la variable $PSItem par defaut <br>3 définir le niveau de criticité <br>4 loger le résultat .DESCRIPTION $continue --> continuer ou non malgré l'erreur $LastError--> changer la valeur par defaut qui est $PSItem $Severity --> défini le niveau d'alerte (1 = ERROR ; 2 = WARNING ; 3 = INFO ; 4 = SUCCESS) $LogFullpath --> défini un chemin de log existant .EXAMPLE try { blabla } catch { TryCatchError -continue OU TryCatchError -continue -Severity 2 -Logpath C:\temp\testfunc.txt } #> param ( [switch]$Continue, [switch]$Popup, $LastError = $PSItem, [Parameter(HelpMessage = "Severity of Log Message (1 = ERROR ; 2 = WARNING ; 3 = INFO ; 4 = SUCCESS)")] [ValidateSet(1, "err", 2, "warn", 3, "inf", 4, "success")] $Severity = 3, [ValidateScript( { Test-Path -Path $_ } )]$LogFullpath ) begin { switch ($Severity) { { ($_ -eq 1) -or ($_ -eq "err") } { $Level = 1 } { ($_ -eq 2) -or ($_ -eq "warn") } { $Level = 2 } { ($_ -eq 3) -or ($_ -eq "inf") } { $Level = 3 } { ($_ -eq 4) -or ($_ -eq "success") } { $Level = 4 } } } process { if ($LogFullpath) { WriteLog -Severity $Level -Message "Script en erreur ligne $($LastError.InvocationInfo.ScriptLineNumber)" -Logpath $LogFullpath WriteLog -Severity $Level -Message "Message d'erreur: $($LastError.Exception.Message)" -Logpath $LogFullpath } else { WriteLog -Severity $Level -Message "Script en erreur ligne $($LastError.InvocationInfo.ScriptLineNumber)" WriteLog -Severity $Level -Message "Message d'erreur: $($LastError.Exception.Message)" } } end { if (!$Continue) { throw $LastError } if ($Popup) { PopUpWindows -level error -Titre "Erreur Ligne $($LastError.InvocationInfo.ScriptLineNumber)" -Message "$($LastError.Exception.Message)" } } } function WriteLog { <# .SYNOPSIS Cette fonction sert a afficher les msg d'info et d'erreur ainsi qu'a les loger si nécéssaire dans un fichier existant .DESCRIPTION $Message --> message qui s'affichera $Severity --> défini le niveau d'alerte (1 = ERROR ; 2 = WARNING ; 3 = INFO ; 4 = SUCCESS) $NoOutFile --> pas de log nécéssaire $LogFullpath --> défini un chemin de log existant .EXAMPLE WriteLog -Severity 1 -Message "test" -NoOutFile WriteLog -Severity 1 -Message "test" -Logpath (new-item c:\temp\log.txt) #> [CmdletBinding()] param( [Parameter( Mandatory = $True, HelpMessage = "Enter Message", Position = 1 )]$Message, [Parameter( Mandatory = $True, HelpMessage = "Severity of Log Message (1 = ERROR ; 2 = WARNING ; 3 = INFO ; 4 = SUCCESS)", Position = 2 )] [ValidateSet(1, "err", 2, "warn", 3, "inf", 4, "success")] $Severity, [Parameter( Mandatory = $False, HelpMessage = "Enter log's Fullpath and already creat, by defaut the log name is scriptname.log et same path", Position = 3 )] [ValidateScript({ Test-Path -Path $_ })] $LogFullPath = (($MyInvocation.ScriptName) | ForEach-Object { [io.path]::ChangeExtension($_, "log") }) ) begin { switch ($Severity) { { ($_ -eq 1) -or ($_ -eq "err") } { $Level = "ERROR" } { ($_ -eq 2) -or ($_ -eq "warn") } { $Level = "WARNING" } { ($_ -eq 3) -or ($_ -eq "inf") } { $Level = "INFO" } { ($_ -eq 4) -or ($_ -eq "success") } { $Level = "SUCCESS" } } $logDate = Get-Date -Format "dd:MM:yyyy hh:mm:ss" $OutLog = $logDate + " " + $Level + " : " } process { switch ($Severity) { { ($_ -eq 1) -or ($_ -eq "err") } { $MessageLog = $OutLog + $Message Write-Output $MessageLog } { ($_ -eq 2) -or ($_ -eq "warn") } { $MessageLog = $OutLog + $Message Write-Output $MessageLog } { ($_ -eq 3) -or ($_ -eq "inf") } { $MessageLog = $OutLog + $Message Write-Output $MessageLog } { ($_ -eq 4) -or ($_ -eq "success") } { $MessageLog = $OutLog + $Message Write-Output $MessageLog } Default { Write-Output "Invalid parameter" } } } end { try { if ($LogFullPath) { if (Test-Path $LogFullPath) { Add-Content -Path $LogFullPath -Value $MessageLog } else { New-Item -Path $LogFullPath | Add-Content -Value $MessageLog } } } catch { TryCatchError -Severity 1 } } } function RebootService { <# .SYNOPSIS Cette fonction sert a relancer un service et forcer par kill du pid si blocage .DESCRIPTION Service --> liste au format array .EXAMPLE $services = (get-service).DisplayName SelectItemListed $services #> param( [ValidateScript({ Get-Service $_ })] [Parameter(Mandatory = $true)] $Service ) begin { $stopped = $false $ServiceStatus = (Get-Service $Service) } process { if ($ServiceStatus.Status -eq "Stopped") { $stopped = $true return } try { $ServiceStatus.Stop() $ServiceStatus.WaitForStatus("Stopped", '00:00:15') while ($ServiceStatus.Status -ne "Stopped") { Write-Information "Le service $Service ne s arrete pas, le processus va etre kill" #trouve le Pid correspondant au processus du service et le kill [array]$ID = tasklist /FI "services eq $service" $ID = ([regex]::Matches($ID, "\d{2,5}") | Select-Object -first 1 ).value taskkill /PID $ID /f $ServiceStatus = (Get-Service $Service) start-sleep 2 } ($ServiceStatus).start() | ForEach-Object ($ServiceStatus).WaitForStatus("running") } catch { TryCatchError } } end { if ($stopped -eq $true) { Write-Output "Service déja stoppé" } elseif ($stopped -eq $false) { Write-Output "service ok" } } } Function SelectItemListed { <# .SYNOPSIS Cette fonction sert a lister des variables et d'extraire la ligne choisis manuellement (peu etre utilisé frompipeline) .DESCRIPTION Itemlist --> liste au format array .EXAMPLE $services = (get-service).DisplayName SelectItemListed $services ou (get-service).DisplayName | SelectItemListed #> param( [ValidateNotNullOrEmpty()] [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [array]$Itemlist ) begin { Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $form = New-Object System.Windows.Forms.Form $form.Text = 'Select a Computer' $form.Size = New-Object System.Drawing.Size(400, 350) $form.StartPosition = 'CenterScreen' $okButton = New-Object System.Windows.Forms.Button $okButton.Location = New-Object System.Drawing.Point(125, 275) $okButton.Size = New-Object System.Drawing.Size(75, 23) $okButton.Text = 'OK' $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.AcceptButton = $okButton $form.Controls.Add($okButton) $cancelButton = New-Object System.Windows.Forms.Button $cancelButton.Location = New-Object System.Drawing.Point(200, 275) $cancelButton.Size = New-Object System.Drawing.Size(75, 23) $cancelButton.Text = 'Cancel' $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $form.CancelButton = $cancelButton $form.Controls.Add($cancelButton) $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point(10, 20) $label.Size = New-Object System.Drawing.Size(280, 20) $label.Text = 'Please select a computer:' $form.Controls.Add($label) $listBox = New-Object System.Windows.Forms.ListBox $listBox.Location = New-Object System.Drawing.Point(10, 40) $listBox.Size = New-Object System.Drawing.Size(365, 20) $listBox.Height = 200 } process { Foreach ($Resultstype in $Itemlist) { #Remplie le tableau de l'interface avec les resultats [void]$listBox.Items.Add("$($Resultstype)") } $form.Controls.Add($listBox) } end { $form.Topmost = $true $selectResult = $form.ShowDialog() if ($selectResult -eq [System.Windows.Forms.DialogResult]::OK) { $valeur = $listBox.SelectedItem Write-Information "Voici la valeur selectionnée " return $valeur } elseif ($selectResult -eq [System.Windows.Forms.DialogResult]::Cancel) { Write-Output "Choix annulé" break } } } function PopUpWindows { <# .SYNOPSIS Cette fonction sert a faire apparaitre un popup windows .DESCRIPTION $level --> niveau de criticité $Titre --> titre du popup $message --> message du popup retourne 1 si succes retourne 0 si echec .EXAMPLE PopUpWindows -level warning -Titre titretest -Message message1 #> param( [ValidateSet("info", "warning", "error")] [string]$level = "info", [ValidateNotNullOrEmpty()] [Parameter(Mandatory = $true)] [string]$Titre, [ValidateNotNullOrEmpty()] [Parameter(Mandatory = $true)] [string]$Message ) begin { $PSDefaultParameterValues['*:Encoding'] = 'utf8' [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $notify = New-Object system.windows.forms.notifyicon $path = Get-Process -id $pid | Select-Object -ExpandProperty Path $icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path) $notify.icon = $icon $notify.visible = $true } process { try { $notify.showballoontip(10, $Titre, $Message, [system.windows.forms.tooltipicon]::$level) Write-Output "Popup envoyé" return 1 } catch { TryCatchError -continue return 0 } } } function SendMsgToTeams { <# .SYNOPSIS Cette fonction sert a envoyer un msg teams via webhook .DESCRIPTION $WebhookURL --> url du webhook $Titre --> titre du msg $message --> corp du msg $couleur --> couleur de la barre retourne 1 si succes retourne 0 si echec .EXAMPLE SendMsgToTeams -WebhookURL $url -Title Merci -message Cordialment -couleur vert #> param( [ValidateNotNullOrEmpty()] [Parameter(Mandatory = $true)] [string]$WebhookURL, [ValidateNotNullOrEmpty()] [Parameter(Mandatory = $true)] [string]$Titre, [ValidateNotNullOrEmpty()] [Parameter(Mandatory = $true)] [string]$message, [Parameter(Mandatory = $false)] [ValidateSet("vert", "jaune", "rouge")] [string]$couleur ) begin { switch ($couleur) { #si choix 1 vert { $color = '008000' } #si choix 2 jaune { $color = 'FFFF00' } #si choix3 rouge { $color = 'FF0000' } } # Hashtable for the body of Teams message $Body = @{ Title = $Titre text = $message themeColor = $color } # Build the request $Param = @{ Headers = @{'accept' = 'application/json' } Body = $Body | ConvertTo-Json Method = 'Post' URI = $WebhookURL ContentType = "application/vnd.api+json; charset=utf-8" } } process { # Send the request to Microsoft Teams Try { Invoke-RestMethod @Param Write-Information "Message envoyé" return 1 } Catch { Write-Error "Erreur ! Impossible d'envoyer le msg teams" TryCatchError -continue return 0 } } } Function PingServer { <# .SYNOPSIS Cette fonction sert testé la connectivité d'un serveur .DESCRIPTION $Server --> host de destination retourne 1 si succes retourne 0 si echec .EXAMPLE PingServer -Server 'S830701SQL011' #> param( [parameter(Mandatory = $true)] $Server ) process { try { $result = [System.Net.NetworkInformation.Ping]::New().Send($Server) } catch { TryCatchError -LastError $PSItem -continue } } end { if ($result) { Write-Information "Test de connexion à $($Server) reussi" return 1 } elseif (!$result) { Write-Information "Test de connexion à $($Server) échoué" return 0 } } } |