Tried to integrate Threading, as by default, a lot of functionnality will hang the GUI

This commit is contained in:
Kawawete 2024-03-13 17:41:33 +01:00
parent a66fb59b6e
commit a42c3bf5ef
2 changed files with 143 additions and 65 deletions

View File

@ -0,0 +1,11 @@
{
"configurations": [
{
"name": "PowerShell: Launch Script",
"type": "PowerShell",
"request": "launch",
"script": "${workspaceFolder}\\sputils.ps1",
"args": []
}
]
}

View File

@ -12,13 +12,28 @@
# Source : C:\Users\SebastienQUEROL\source\repos\sharepointmover-gui\Form1.Designer.cs # Source : C:\Users\SebastienQUEROL\source\repos\sharepointmover-gui\Form1.Designer.cs
################################################################################ ################################################################################
function Get-ScriptDirectory ###############Thread Setup
{ #Return the directory name of this script
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
Split-Path $Invocation.MyCommand.Path
}
$ScriptPath = Get-ScriptDirectory $Global:syncHash = [hashtable]::Synchronized(@{})
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState ="STA"
$newRunspace.ThreadOptions ="ReuseThread"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
###########################
##Aucune foutre idée de ce qu'est cense faire ce morceau de code, ca a été généré par le createur de forms
# function Get-ScriptDirectory
# { #Return the directory name of this script
# $Invocation = (Get-Variable MyInvocation -Scope 1).Value
# Split-Path $Invocation.MyCommand.Path
# }
# $ScriptPath = Get-ScriptDirectory
###
#### Premier runspace, contien le programme dans sa totalité
$MainWindowGUI = [PowerShell]::Create().AddScript({
# Chargement des assemblies externes # Chargement des assemblies externes
Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Windows.Forms
@ -209,7 +224,7 @@ $BconnectSP.UseVisualStyleBackColor = $true
# #
$URLTenant.Location = New-Object System.Drawing.Point(22, 55) $URLTenant.Location = New-Object System.Drawing.Point(22, 55)
$URLTenant.Name = "URLTenant" $URLTenant.Name = "URLTenant"
$URLTenant.Text = "https://perlinpimpim-admin.sharepoint.com" $URLTenant.Text = "https://guycarlier.sharepoint.com"
$URLTenant.Size = New-Object System.Drawing.Size(325, 20) $URLTenant.Size = New-Object System.Drawing.Size(325, 20)
$URLTenant.TabIndex = 1 $URLTenant.TabIndex = 1
# #
@ -364,7 +379,7 @@ $tabPage5.UseVisualStyleBackColor = $true
$LresultsMove.HideSelection = $false $LresultsMove.HideSelection = $false
$LresultsMove.Location = New-Object System.Drawing.Point(8, 173) $LresultsMove.Location = New-Object System.Drawing.Point(8, 173)
$LresultsMove.Name = "LresultsMove" $LresultsMove.Name = "LresultsMove"
$LresultsMove.FullRowSelect = true #$LresultsMove.FullRowSelect = true
$LresultsMove.Size = New-Object System.Drawing.Size(776, 190) $LresultsMove.Size = New-Object System.Drawing.Size(776, 190)
$LresultsMove.TabIndex = 7 $LresultsMove.TabIndex = 7
$LresultsMove.AutoSize = $true $LresultsMove.AutoSize = $true
@ -385,76 +400,123 @@ $FMain.Text = "SharePoint Utils GUI"
#Onglet Move #Onglet Move
##Lister les sites dans les comboBoxes ##Lister les sites dans les comboBoxes
$BlistSites.Add_Click({ $BlistSites.Add_Click({
#On vide la variable pnpConnection pour ne pas avoir de faux positifs $newRunspace =[runspacefactory]::CreateRunspace()
$pnpConnection=$Null $newRunspace.ApartmentState ="STA"
#On stocke la derniere connection PnP $newRunspace.ThreadOptions ="ReuseThread"
$pnpConnection = Get-PnPConnection | Out-string $newRunspace.Open()
#A ameliorer, mais pour l'instant, ca devrait passer $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
if(-not ([string]::IsNullOrEmpty($pnpConnection))){
$CBdestSite.Items.Clear() $BlistSitesRunSpace = [PowerShell]::Create().AddScript({
$CBsourceSite.Items.Clear()
$sitesList = $null #On vide la variable pnpConnection pour ne pas avoir de faux positifs
$sitesList = Get-PnPTenantSite | Where -Property Template -NotIn ("SRCHCEN#0", "REDIRECTSITE#0", "SPSMSITEHOST#0", "APPCATALOG#0", "POINTPUBLISHINGHUB#0", "EDISC#0", "STS#-1", 'EHS#1','POINTPUBLISHINGTOPIC#0') | Select url $pnpConnection=$Null
$LresultsMove.Items.Clear() #On stocke la derniere connection PnP
foreach($siteUrl in $sitesList){ $pnpConnection = Get-PnPConnection | Out-string
$siteUrl -match "@{Url=(?<content>.*)}" #A ameliorer, mais pour l'instant, ca devrait passer
$siteUrlClean = $matches["content"] if(-not ([string]::IsNullOrEmpty($pnpConnection))){
$CBsourceSite.Items.Add([string]$siteUrlClean) $CBdestSite.Items.Clear()
$CBdestSite.Items.Add([string]$siteUrlClean) $CBsourceSite.Items.Clear()
} $sitesList = $null
} $sitesList = Get-PnPTenantSite | Where-Object -Property Template -NotIn ("SRCHCEN#0", "REDIRECTSITE#0", "SPSMSITEHOST#0", "APPCATALOG#0", "POINTPUBLISHINGHUB#0", "EDISC#0", "STS#-1", 'EHS#1','POINTPUBLISHINGTOPIC#0') | Select-Object url
elseif(([string]::IsNullOrEmpty($pnpConnection))){ $LresultsMove.Items.Clear()
$LresultsMove.Items.Clear() foreach($siteUrl in $sitesList){
$LresultsMove.Items.Add("Connectez-vous au tenant d'abord") $siteUrl -match "@{Url=(?<content>.*)}"
$siteUrlClean = $matches["content"]
$CBsourceSite.Items.Add([string]$siteUrlClean)
$CBdestSite.Items.Add([string]$siteUrlClean)
}
} }
else{ elseif(([string]::IsNullOrEmpty($pnpConnection))){
$LresultsMove.Items.Clear() $LresultsMove.Items.Clear()
$LresultsMove.Items.Add("Connectez-vous au tenant d'abord") $LresultsMove.Items.Add("Connectez-vous au tenant d'abord")
} }
else{
$LresultsMove.Items.Clear()
$LresultsMove.Items.Add("Connectez-vous au tenant d'abord")
}
})
$BlistSitesRunSpace.PowerShell.Runspace = $newRunspace
$BlistSitesRunSpace.Thread = $BlistSitesRunSpace.PowerShell.BeginInvoke()
}) })
##Bouger les dossiers ##Bouger les dossiers
# $copyIt = {
# param ($sourceSite,$destSite)
# $sourceSite = $sourceSite -Replace '[A-Za-z]+://([A-Za-z]+(\.[A-Za-z]+)+)',''
# $destSite = $destSite -Replace '[A-Za-z]+://([A-Za-z]+(\.[A-Za-z]+)+)',''
# $jobCopyPending = Copy-PnPFile -SourceUrl "$sourceSite" -TargetUrl "$destSite" -Force -OverwriteIfAlreadyExists
# $jobStatus = Receive-PnPCopyMoveJobStatus -Job $jobCopyPending -Wait
# Write-Output $jobStatus
# }
$Bgo.Add_Click({ $Bgo.Add_Click({
$sourceSite = $CBsourceSite.Text
$destSite = $CBdestSite.Text
$jobMovePending = Copy-PnPFile -SourceUrl $sourceSite -TargetUrl $destSite -Force -OverwriteIfAlreadyExists $newRunspace =[runspacefactory]::CreateRunspace()
$jobStatus = Receive-PnPCopyMoveJobStatus -Job $jobMovePending $newRunspace.ApartmentState ="STA"
Write-Host $jobStatus $newRunspace.ThreadOptions ="ReuseThread"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$copySPRunspace.PowerShell = [PowerShell]::Create().AddScript({
$destSite = $CBdestSite.Text
$sourceSite = $CBsourceSite.Text
$sourceSite = $sourceSite -Replace '[A-Za-z]+://([A-Za-z]+(\.[A-Za-z]+)+)',''
$destSite = $destSite -Replace '[A-Za-z]+://([A-Za-z]+(\.[A-Za-z]+)+)',''
$jobCopyPending = Copy-PnPFile -SourceUrl "$sourceSite" -TargetUrl "$destSite" -Force -OverwriteIfAlreadyExists
$jobStatus = Receive-PnPCopyMoveJobStatus -Job $jobCopyPending -Wait
Write-Output $jobStatus
})
$copySPRunspace.PowerShell.Runspace = $newRunspace
$copySPRunspace.Thread = $copySPRunspace.PowerShell.BeginInvoke()
}) })
#Onglet Parametres #Onglet Parametres
##Connexion Sharepoint ##Connexion Sharepoint
$pnpConnection=$null
$pnpConnection = Get-PnPConnection | Out-string
$tenantURL = $URLTenant.Text
$BconnectSP.Add_Click({ $BconnectSP.Add_Click({
Disconnect-PnPOnline
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState ="STA"
$newRunspace.ThreadOptions ="ReuseThread"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$pnpConnection=$null $connectToSPRunspace.PowerShell = [PowerShell]::Create().AddScript({
$pnpConnection = Get-PnPConnection | Out-string Connect-PnPOnline -Url $tenantURL -Interactive | Out-String
$tenantURL = $URLTenant.Text
$connResults = Connect-PnPOnline -Url $tenantURL -Interactive 2>&1 | Out-String
Switch ($ERROR) Switch ($ERROR)
{ {
{$ERROR[0] -match "Host not reachable" }{ {$ERROR[0] -match "Host not reachable" }{
$label4.Text = "Injoignable" $label4.Text = "Injoignable"
$label4.ForeColor = [System.Drawing.Color]::MediumVioletRed $label4.ForeColor = [System.Drawing.Color]::MediumVioletRed
Break} Break}
{$ERROR[0] -match "User canceled authentication."}{ {$ERROR[0] -match "User canceled authentication."}{
$label4.Text = "Annulé" $label4.Text = "Annulé"
$label4.ForeColor = [System.Drawing.Color]::MediumVioletRed $label4.ForeColor = [System.Drawing.Color]::MediumVioletRed
Break} Break}
{-not ([string]::IsNullOrEmpty($pnpConnection))}{ {-not ([string]::IsNullOrEmpty($pnpConnection))}{
$label4.Text = "Connecté" $label4.Text = "Connecté"
$label4.ForeColor = [System.Drawing.Color]::Green $label4.ForeColor = [System.Drawing.Color]::Green
}
Default {
$label4.Text = "Connecté"
$label4.ForeColor = [System.Drawing.Color]::Green
}
} }
Default { })
$label4.Text = "Connecté" $connectToSPRunspace.PowerShell.Runspace = $newRunspace
$label4.ForeColor = [System.Drawing.Color]::Green $connectToSPRunspace.Thread = $connectToSPRunspace.PowerShell.BeginInvoke()
} })
}
})
function OnFormClosing_FMain{ function OnFormClosing_FMain{
@ -478,3 +540,8 @@ $FMain.Add_Shown({$FMain.Activate()})
$ModalResult=$FMain.ShowDialog() $ModalResult=$FMain.ShowDialog()
# Libération de la Form # Libération de la Form
$FMain.Dispose() $FMain.Dispose()
})
$MainWindowGUI.Runspace = $newRunspace
$data = $MainWindowGUI.BeginInvoke()