MergeNavObject.WithProperties.v3.ps1

function Merge-NAVObjectsWithProperties2{
    param(
        [parameter(Mandatory=$false)]
        [string]$workFolder,
        [parameter(Mandatory=$true)]
        [string]$sourceBaseFolder,
        [parameter(Mandatory=$true)]
        [string]$sourceModFolder,
        [parameter(Mandatory=$true)]
        [string]$targetBaseFolder,
        [parameter(Mandatory=$true)]
        [string]$resultFolder,
        [string]$objectName)

    if (-not $workFolder.EndsWith("\")) {$workFolder += "\"}
    if ($workFolder -eq "\") {$workFolder = ""}
    if (-not $sourceBaseFolder.EndsWith("\")) {$sourceBaseFolder += "\"}
    if (-not $sourceModFolder.EndsWith("\")) {$sourceModFolder += "\"}
    if (-not $targetBaseFolder.EndsWith("\")) {$targetBaseFolder += "\"}
    if (-not $resultFolder.EndsWith("\")) {$resultFolder += "\"}

    if ($objectName -eq "") {
        $fileCount = (Get-ChildItem $workFolder$targetBaseFolder).Count
        $fileIndex = 0
        foreach ($f in Get-ChildItem $workFolder$targetBaseFolder) {
            $fileIndex ++
            $progress = [math]::Round(($fileIndex / $fileCount) * 100)
            #write-host "---------merge progress: $progress% ($fileIndex of $fileCount)"
            #write-host ([math]::Round($fileindex / $filecount*100))
            Write-Progress -Activity “Merge Progress” -status “%$progress Processing file $f” -percentComplete ([math]::Round($fileindex / $filecount*100))
            if (Test-Path $workFolder$sourceModFolder$f) {
                #write-host "merging $f..."
                $r = Merge-NAVObjectWithProperties2 -workFolder $workFolder -sourceBaseFolder $sourceBaseFolder -sourceModFolder $sourceModFolder -targetBaseFolder $targetBaseFolder -resultFolder $resultFolder -objectName $f -batchMode $true
            } else {
                #write-host "copying $f..."
                $r = copy-item -path $workFolder$targetBaseFolder$f -Destination $workFolder$resultFolder$f
            }
        }
    } else {
        Merge-NAVObjectWithProperties2 -workFolder $workFolder -sourceBaseFolder $sourceBaseFolder -sourceModFolder $sourceModFolder -targetBaseFolder $targetBaseFolder -resultFolder $resultFolder -objectName $objectName -openInBeyondCompare $true
    }
}

function Merge-NAVObjectWithProperties2{
    param(
        [parameter(Mandatory=$false)]
        [string]$workFolder,
        [parameter(Mandatory=$true)]
        [string]$sourceBaseFolder,
        [parameter(Mandatory=$true)]
        [string]$sourceModFolder,
        [parameter(Mandatory=$true)]
        [string]$targetBaseFolder,
        [parameter(Mandatory=$true)]
        [string]$resultFolder,
        [parameter(Mandatory=$true)]
        [string]$objectName,
        [boolean]$openInBeyondCompare,
        [boolean]$batchMode)

    # merge changes
    $progressPreference = 'silentlyContinue'    # Subsequent calls do not display UI.
    Merge-NAVApplicationObject `
        -OriginalPath $workFolder$sourceBaseFolder$objectName `
        -ModifiedPath $workFolder$sourceModFolder$objectName `
        -TargetPath $workFolder$targetBaseFolder$objectName `
        -ResultPath $workFolder$resultFolder$objectName `
        -DocumentationConflict TargetFirst `
        -Force
    $progressPreference = 'Continue'            # Subsequent calls do display UI.

    # get object details
    if (-not $batchMode) {
        write-host "merging object properties..."
    }

    $sourceObjectDetails = Get-NAVApplicationObjectProperty -Source $workFolder$sourceBaseFolder$objectName
    $modObjectDetails = Get-NAVApplicationObjectProperty -Source $workFolder$sourceModFolder$objectName
    $targetObjectDetails = Get-NAVApplicationObjectProperty -Source $workFolder$targetBaseFolder$objectName

    # merge versions
    $sourceVersionList =  $sourceObjectDetails | select VersionList
    $sourceVersions = $sourceVersionList.VersionList.Split(",")

    $modVersionList = $modObjectDetails | select VersionList
    $modVersions = $modVersionList.VersionList.Split(",")

    $targetVersionList = $targetObjectDetails | select VersionList

    foreach ($v in $sourceVersions) {
        $modVersions = $modVersions -ne $v
    }

    foreach ($v in $modVersions) {
        if ($v.StartsWith("NAV")) {$modVersions = $modVersions -ne $v}
    }

    if ($modVersions.Length -gt 0) {
        $newVersionList = ""
        if ($targetVersionList -ne "") {
            $newVersionList = $targetVersionList.VersionList;
        }
        foreach ($v in $modVersions) {
            if ($newVersionList -ne "") {
                $newVersionList += "," + $v
            } else {
                $newVersionList = $v
            }
        }
        Set-NAVApplicationObjectProperty -TargetPath $workFolder$resultFolder$objectName -VersionListProperty $newVersionList
    }

    # merge modified
    $modModified = $modObjectDetails | select Modified
    if ($modModified.Modified) {
        Set-NAVApplicationObjectProperty -TargetPath $workFolder$resultFolder$objectName -ModifiedProperty "Yes"
    }

    # merge date & time
    $sourceDate = $sourceObjectDetails.Date
    $modDate = $modObjectDetails.Date
    $targetDate = $targetObjectDetails.Date

    if ($modDate -ne $sourceDate) {
        if ([datetime]::ParseExact($modDate,"dd/MM/yy", $null) -gt [datetime]::ParseExact($targetDate,"dd/MM/yy",$null)) {
            $newDateTime = $modObjectDetails.Date.ToString() + " " + $modObjectDetails.Time.ToString()
            Set-NAVApplicationObjectProperty -TargetPath $workFolder$resultFolder$objectName -DateTimeProperty $newDateTime
        }
        Set-NAVApplicationObjectProperty -TargetPath $workFolder$resultFolder$objectName -ModifiedProperty "Yes"
    }

    if (-not $batchMode) {
        write-host "object merged"
    }

    if ($openInBeyondCompare) {
        if (-not $batchMode) {
            write-host "opening in BeyondCompare..."
        }

        $bcomp = "`"C:\Program Files (x86)\Beyond Compare 4\BComp.exe`""

        Start-Process -FilePath $bcomp -ArgumentList "/fv `"$workFolder$sourceModFolder$objectName`" `"$workFolder$sourceBaseFolder$objectName`"" 
        Start-Process -FilePath $bcomp -ArgumentList "/fv `"$workFolder$resultFolder$objectName`" `"$workFolder$targetBaseFolder$objectName`"" 
        Start-Process -FilePath $bcomp -ArgumentList "/fv `"$workFolder$targetBaseFolder$objectName`" `"$workFolder$sourceBaseFolder$objectName`"" 
        Start-Process -FilePath $bcomp -ArgumentList "/fv `"$workFolder$resultFolder$objectName`" `"$workFolder$sourceBaseFolder$objectName`"" 
    }
}