Powershell/Exemples/Dichotomie.ps1
2023-07-04 12:59:44 +02:00

195 lines
6.3 KiB
PowerShell

<#
.SYNOPSIS
<Overview of script>
.NOTES
Version : 1.0
Author : Hubert CORNET
Creation Date : <Date>
Purpose/Change : <Initial script development>
.LINK
https://www.tips-of-mine.fr
.EXEMPLE
<Example goes here. Repeat this attribute for more than one example>
.DESCRIPTION
<Brief description of script>
.PARAMETER <Parameter_Name>
<Brief description of parameter input required. Repeat this attribute if required>
.INPUTS
<Inputs if any, otherwise state None>
.OUTPUTS
<Outputs if any, otherwise state None - example: Log file stored in C:\Windows\Temp\<name>.log>
#>
#---------------------------------------------------------[Initialisations]--------------------------------------------------------
[CmdletBinding()]
Param(
[Parameter(Position=0,Mandatory=$True)]
[string]$CheminSource,
[Parameter(Position=1,Mandatory=$True)]
[string]$Pattern,
[Parameter(Position=2,Mandatory=$True)]
[int]$Pourcentage
)
# Définir l'action d'erreur pour continuer silencieusement
$ErrorActionPreference = "SilentlyContinue"
#----------------------------------------------------------[Declarations]----------------------------------------------------------
# Version Script
$sScriptVersion = "1.0"
#Log File Info
$sLogPath = "C:\Tmp"
$sLogName = "Dichotomie.log"
$sLogFile = Join-Path -Path $sLogPath -ChildPath $sLogName
Start-Transcript -Path $sLogFile -NoClobber
$Date = Get-Date -Format "yyyyMMdd HHmm"
$FolderBackup = $CheminSource+"\Backup - "+$Date
$FolderLotA = $CheminSource+"\Lot-A"
$FolderLotB = $CheminSource+"\Lot-B"
$FolderLock = $CheminSource+"\Fichier Bloquant - "+$Date
$Compteur = 0
#-----------------------------------------------------------[Functions]------------------------------------------------------------
Function Login-RestApi {
[cmdletbinding()]
param(
[string] $ApiUrl,
[string] $OpConUser,
[string] $OpConPassword
)
Write-Verbose ("Parameters =")
Write-Verbose ("ApiUrl: " + $ApiUrl)
Write-Verbose ("OpConUser: " + $OpConUser)
Write-Verbose ("OpConPassword: (hidden)")
$ApiUrl = $ApiUrl.ToLower().TrimEnd("/").TrimEnd("/api")
Write-Host ("Logging in to OpCon REST API: " + $ApiUrl)
$Global:OpconRESTApiUrl = $ApiUrl
$Global:OpconRESTApiUser = $OpConUser
$Global:OpConRESTApiPassword = $OpConPassword
$token = Get-OpConApiToken -Url $ApiUrl -User $OpConUser -Password $OpConPassword
$Global:OpconRESTApiToken = $token.id
$Global:OpconRESTApiAuthHeader = Get-OpConApiAuthHeader -Token $token.id
Write-Host ('Token successfully stored for future calls in session.')
}
Function Ignore-SelfSignedCerts {
add-type -TypeDefinition @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
}
Function Get-OpConApiToken {
[cmdletbinding()]
param(
[string] $Url,
[string] $User,
[string] $Password
)
$tokensUri = -join($Url, "/api/tokens")
Write-Host ("Retrieving authorization token...")
Write-Host ("Uri: " + $tokensUri)
Write-Host ("User: " + $User)
$tokenObject = @{
user = @{
loginName = $User
password = $Password
}
tokenType = @{
type = "User"
}
}
try
{
Ignore-SelfSignedCerts
#$token = Invoke-RestMethod -Method Post -Uri $tokensUri -Body (ConvertTo-Json $tokenObject) -ContentType 'application/json; charset=utf-8' -ErrorVariable $RestException -SkipCertificateCheck
$token = Invoke-RestMethod -Method Post -Uri $tokensUri -Body (ConvertTo-Json $tokenObject) -ContentType 'application/json; charset=utf-8' -ErrorVariable $RestException
}
catch
{
## $error = ConvertFrom-Json $RestException.ErrorDetails.Message
##Write-Host ("Unable to fetch token for user '" + $user + "'")
##Write-Host ("Error Code: " + $error.code)
##Write-Host ("Message: " + $error.message)
Write-Host ("StatusCode: " + $_.Exception.Response.StatusCode.value__)
Write-Host ("StatusDescription: " + $_.Exception.Response.StatusDescription)
Write-Host ("Message: " + $_[0].message)
##$Global:OpConRESTAPIException = $_
throw
##exit $_.Exception.Response.StatusCode.value__
}
Write-Host ("Token retrieved successfully, Id: " + $token.id + ", Valid Until: " + $token.validUntil)
return $token
}
Function Get-OpConApiAuthHeader {
Param(
[string] $Token
)
$authHeader = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$authHeader.Add("Authorization", ("Token " + $Token))
return $authHeader
}
#--------------------------------------------------------[Debut Du Script]---------------------------------------------------------
Login-RestApi -ApiUrl $ServerUrl -OpConUser $OpConUser -OpConPassword $clearPassword
#Nombre de fichier présent dans le répertoire
$ListFile = Get-ChildItem -Path $CheminSource"\*" -Include "*.$Pattern" | Select Name,FullName
$FileCount = $ListFile.count
$PourcentageFichier = (($Pourcentage/100)*$FileCount)
$PourcentageFichier = [math]::floor($PourcentageFichier)
If (!(Test-Path $FolderBackup)) {
New-Item -Path $FolderBackup -ItemType Directory
New-Item -Path $FolderLotA -ItemType Directory
New-Item -Path $FolderLotB -ItemType Directory
New-Item -Path $FolderLock -ItemType Directory
}
Foreach ($File in $ListFile) {
Copy-Item $File.FullName -Destination $FolderBackup
If ($Compteur -le $PourcentageFichier) {
Move-Item $File.FullName -Destination $FolderLotA
}
Else {
Move-Item $File.FullName -Destination $FolderLotB
}
$Compteur = $Compteur + 1
}
#---------------------------------------------------------[Fin Du Script]----------------------------------------------------------
Stop-Transcript