3.1.3
Bulk Compare, Bulk Copy + bug fixes
This commit is contained in:
173
Extensions/Copy.psm1
Normal file
173
Extensions/Copy.psm1
Normal file
@@ -0,0 +1,173 @@
|
||||
function Get-ModuleVersion
|
||||
{
|
||||
'1.0.0'
|
||||
}
|
||||
|
||||
function Invoke-InitializeModule
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
function Invoke-ViewActivated
|
||||
{
|
||||
if($global:currentViewObject.ViewInfo.ID -ne "IntuneGraphAPI") { return }
|
||||
|
||||
$tmp = $mnuMain.Items | Where Name -eq "EMBulk"
|
||||
if($tmp)
|
||||
{
|
||||
$tmp.AddChild(([System.Windows.Controls.Separator]::new())) | Out-Null
|
||||
$subItem = [System.Windows.Controls.MenuItem]::new()
|
||||
$subItem.Header = "Cop_y"
|
||||
$subItem.Add_Click({Show-CopyBulkForm})
|
||||
$tmp.AddChild($subItem)
|
||||
}
|
||||
}
|
||||
|
||||
function Show-CopyBulkForm
|
||||
{
|
||||
$script:form = Get-XamlObject ($global:AppRootFolder + "\Xaml\BulkCopy.xaml") -AddVariables
|
||||
if(-not $script:form) { return }
|
||||
|
||||
$global:txtCopyFromPattern.Text = Get-Setting "Copy" "CopyFromPattern"
|
||||
$global:txtCopyToPattern.Text = Get-Setting "Copy" "CopyToPattern"
|
||||
|
||||
$script:copyObjects = @()
|
||||
foreach($objType in $global:lstMenuItems.ItemsSource)
|
||||
{
|
||||
if(-not $objType.Title) { continue }
|
||||
|
||||
$script:copyObjects += New-Object PSObject -Property @{
|
||||
Title = $objType.Title
|
||||
Selected = $true
|
||||
ObjectType = $objType
|
||||
}
|
||||
}
|
||||
|
||||
$column = Get-GridCheckboxColumn "Selected"
|
||||
$global:dgObjectsToCopy.Columns.Add($column)
|
||||
|
||||
$column.Header.IsChecked = $true # All items are checked by default
|
||||
$column.Header.add_Click({
|
||||
foreach($item in $global:dgObjectsToCopy.ItemsSource)
|
||||
{
|
||||
$item.Selected = $this.IsChecked
|
||||
}
|
||||
$global:dgObjectsToCopy.Items.Refresh()
|
||||
}
|
||||
)
|
||||
|
||||
# Add Object type column
|
||||
$binding = [System.Windows.Data.Binding]::new("Title")
|
||||
$column = [System.Windows.Controls.DataGridTextColumn]::new()
|
||||
$column.Header = "Object type"
|
||||
$column.IsReadOnly = $true
|
||||
$column.Binding = $binding
|
||||
$global:dgObjectsToCopy.Columns.Add($column)
|
||||
|
||||
$global:dgObjectsToCopy.ItemsSource = $script:copyObjects
|
||||
|
||||
Add-XamlEvent $script:form "btnClose" "add_click" {
|
||||
$script:form = $null
|
||||
Show-ModalObject
|
||||
}
|
||||
|
||||
Add-XamlEvent $script:form "btnStartCopy" "add_click" {
|
||||
Write-Status "Copy objects"
|
||||
Start-BulkCopyObjects
|
||||
Write-Status ""
|
||||
}
|
||||
|
||||
Show-ModalForm "Bulk Copy Objects" $script:form -HideButtons
|
||||
}
|
||||
|
||||
function Start-BulkCopyObjects
|
||||
{
|
||||
Write-Log "****************************************************************"
|
||||
Write-Log "Start bulk copy"
|
||||
Write-Log "****************************************************************"
|
||||
|
||||
$copyFrom = $global:txtCopyFromPattern.Text
|
||||
$copyTo = $global:txtCopyToPattern.Text
|
||||
|
||||
if(-not $copyFrom -or -not $copyTo)
|
||||
{
|
||||
[System.Windows.MessageBox]::Show("Both name patterns must be specified", "Error", "OK", "Error")
|
||||
return
|
||||
}
|
||||
|
||||
Save-Setting "Copy" "CopyFromPattern" $global:txtCopyFromPattern.Text
|
||||
Save-Setting "Copy" "CopyToPattern" $global:txtCopyToPattern.Text
|
||||
|
||||
foreach($item in ($global:dgObjectsToCopy.ItemsSource | where Selected -eq $true))
|
||||
{
|
||||
Write-Status "Copy $($item.ObjectType.Title) objects" -Force -SkipLog
|
||||
Write-Log "----------------------------------------------------------------"
|
||||
Write-Log "Copy $($item.ObjectType.Title) objects"
|
||||
Write-Log "----------------------------------------------------------------"
|
||||
|
||||
$url = $item.ObjectType.API
|
||||
if($item.ObjectType.QUERYLIST)
|
||||
{
|
||||
$url = "$($url.Trim())?$($item.ObjectType.QUERYLIST.Trim())"
|
||||
}
|
||||
|
||||
$graphObjects = @(Get-GraphObjects -Url $url -property $item.ObjectType.ViewProperties -objectType $item.ObjectType)
|
||||
|
||||
$nameProp = ?? $item.ObjectType.NameProperty "displayName"
|
||||
|
||||
foreach($graphObj in ($graphObjects | Where { $_.Object."$($nameProp)" -imatch [regex]::Escape($copyFrom) }))
|
||||
{
|
||||
$sourceName = $graphObj.Object."$($nameProp)"
|
||||
$copyName = $sourceName -ireplace [regex]::Escape($copyFrom),$copyTo
|
||||
|
||||
$copyObj = $graphObjects | Where { $_.Object."$($nameProp)" -eq $copyName -and $_.Object.'@OData.Type' -eq $graphObj.Object.'@OData.Type' }
|
||||
|
||||
if(($copyObj | measure).Count -gt 0)
|
||||
{
|
||||
Write-Log "Object with name $copyName already exists. $sourceName will not be copied" 2
|
||||
continue
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Status "Create $copyName from $sourceName" -Force
|
||||
|
||||
if($graphObj.ObjectType.PreCopyCommand)
|
||||
{
|
||||
if((& $graphObj.ObjectType.PreCopyCommand $graphObj.Object $graphObj.ObjectType $copyName))
|
||||
{
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
$copyFromObj = (Get-GraphObject $graphObj.Object $graphObj.ObjectType -SkipAssignments).Object
|
||||
|
||||
# Convert to Json and back to clone the object
|
||||
$obj = ConvertTo-Json $copyFromObj -Depth 10 | ConvertFrom-Json
|
||||
if($obj)
|
||||
{
|
||||
# Import new profile
|
||||
Set-GraphObjectName $obj $graphObj.ObjectType $copyName
|
||||
|
||||
$newObj = Import-GraphObject $obj $graphObj.ObjectType
|
||||
if($newObj)
|
||||
{
|
||||
if($graphObj.ObjectType.PostCopyCommand)
|
||||
{
|
||||
& $graphObj.ObjectType.PostCopyCommand $copyFromObj $newObj $graphObj.ObjectType
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-log "Failed to copy $sourceName" 3
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Log "****************************************************************"
|
||||
Write-Log "Bulk copy finished"
|
||||
Write-Log "****************************************************************"
|
||||
Write-Status ""
|
||||
}
|
||||
Reference in New Issue
Block a user