0

Can anyone help me troubleshoot why this PSCX cmdlet 'Write-Zip' is so slow? It takes 1.5 hours when the DotNetZip library can ZIP the same folders in about 20 minutes. (The issue with the DotNetZip library is that it chokes with large files, so I switched over to PSCX which is perfect, cool little progress bar and it actually works too, just very slowly).

Here is some sample code, let me know if you need to see anything else.

    $ElapsedTime = [System.Diagnostics.Stopwatch]::StartNew()

    Write-Host "Script Started at $(get-date)"

    Import-Module Pscx
    Import-Module BitsTransfer

    Write-Host "Just imported the BitsTransfer and Pscx modules"

    Write-Host "*** Starting backup portion of script ***"

    foreach($i in $appServers) {

            if (!(Test-Path -path \\$i\c$\newDeploy)) {
                New-Item \\$i\c$\newDeploy -type directory
                Write-Host "Just created newDeploy folder on $i"
            }
            if (!(Test-Path -path \\$i\c$\newDeploy\backup)) {
                New-Item \\$i\c$\newDeploy\backup -type directory
                Write-Host "Just created newDeploy\backup folder on $i"
            }
            if(!(Test-Path \\$i\c$\newDeploy\zipper.ps1)) {
                Start-BitsTransfer -Source \\$appDeployServer\c$\newDeploy\zipper.ps1 -Destination \\$i\c$\newDeploy
                Write-host "Just added zipper.ps1 to $i"
            }

    }

    foreach($i in $appServers) {

        $sessionForI = New-PSSession -computername $i
        Invoke-Command -Session $sessionForI -ArgumentList  $aosFolder, $i, $ElapsedTime -ScriptBlock {
            param ($aosFolder, $i, $ElapsedTime)

            Import-Module Pscx
            Write-Host "Just imported Pscx module for $i"

            if ((Test-Path C:\\newDeploy\\backup\\$aosFolder.zip)) {
                Remove-Item C:\\newDeploy\\backup\\$aosFolder.zip
                Write-Host "Just removed newDeploy\backup\$aosFolder.zip on $i"
            }

            Write-Host "Just started creating new ZIP file backup created on $i"
            Write-Host "   Elapsed Time: $($ElapsedTime.Elapsed.ToString())"

            cd "C:\Program Files (x86)\Folder\$aosFolder"
            Get-ChildItem "C:\Program Files (x86)\Folder\$aosFolder" -Recurse -Exclude *.e2e | Write-Zip -OutputPath "C:\newDeploy\backup\$aosFolder.zip" -NoClobber -Level 1

            write-host "   Elapsed Time: $($ElapsedTime.Elapsed.ToString())"
            Write-Host "Just finished creating new ZIP file backup created on $i"
        }
        remove-PSSession -session $sessionForI

    }

    Write-Host "Just ran second foreach loop to ZIP all folders to backup on each server"

    foreach($i in $appServers) {
        if(!(Test-Path -path C:\newDeploy\backup\$i)) {
            New-Item C:\newDeploy\backup\$i -type directory
            Write-Host "Just created DEPLOY SERVER's newDeploy\backup\$i folder for backups"
        }
        Start-BitsTransfer -Source \\$i\c$\newDeploy\backup\$aosFolder.zip -Destination C:\newDeploy\backup\$i
        Write-Host "$i backup ZIP transferred to deploy server"
    }

    Write-Host "Just ran third foreach loop to move all ZIP files to the backup server for each remote server"

    foreach($i in $appServers) {
        Remove-Item \\$i\c$\newDeploy\backup\$aosFolder.zip
        Write-Host "Just removed newDeploy\backup\$aosFolder.zip on $i"
    }

    Write-Host "Just ran forth foreach loop to delete all backup ZIP files to cleanup"

    $date = get-date -format "M-d-yyyy"
    Write-Zip -Path "C:\newDeploy\backup" -OutputPath "C:\newDeploy\backup\$date APPbackup.zip" -NoClobber -Level 1
    Write-Host "Just ran final ZIP command to put all server's backups into one neat ZIP"

    foreach($i in $appServers) {
        if((Test-Path -path C:\newDeploy\backup\$i)) {
            Remove-Item -Force -Recurse C:\newDeploy\backup\$i
            Write-Host "Just removed DEPLOY SERVER's newDeploy\backup\$i folder"
        }
    }
    Write-Host "Just ran fifth foreach loop to delete each server's backup folder on the local server to cleanup"

    Write-Host "*** Finished with backup portion of script ***"

    Write-Host "*** Starting deploy preparation portion of script ***"



    Write-Host "*** Finished with deploy preparation portion of script ***"

    Write-Host "Script Ended at $(get-date)"
Kiquenet
  • 14,494
  • 35
  • 148
  • 243
user1161625
  • 642
  • 1
  • 8
  • 13

2 Answers2

3

I would recommend that you use the 7zip commandline archive tools. They are pretty snappy and can work with variety of archives.

http://downloads.sourceforge.net/sevenzip/7za920.zip

manojlds
  • 290,304
  • 63
  • 469
  • 417
0

Here's the way I've done:

set-alias sz "$env:C:\7za920\7za.exe"
sz a -mx9 -tzip -r $FileName $SourceFolder
gandarez
  • 2,609
  • 4
  • 34
  • 47