Skip to content

How to Deploy Files to a Remote Server via Robocopy in Batch Script

Learn how to use Robocopy in Batch Scripts for reliable, resumable, and bandwidth-efficient file deployments to remote servers via UNC paths, including mirror sync, incremental updates, and production workflows.

Robocopy (Robust File Copy) is Windows' built-in enterprise-grade file synchronization tool. It is specifically designed for reliable, resumable, and bandwidth-efficient file transfers, making it the ideal choice for deploying application files to remote servers over network shares (UNC paths). Unlike simple xcopy or copy, Robocopy handles retries on network failures, mirrors directory structures, preserves timestamps, and provides detailed logging.

In this guide, we will explore how to deploy files to remote servers using Robocopy from a Batch Script, covering basic deployments, mirror sync, incremental updates, and production-grade deployment workflows.

Understanding Robocopy Basics

robocopy <source> <destination> [files] [options]

Key advantages over copy and xcopy:

  • Resumable: Automatically retries failed copies.
  • Incremental: Only copies changed files by default.
  • Mirror mode: Makes destination an exact replica of source.
  • Bandwidth throttling: Limits network usage during transfers.
  • Detailed logging: Records every action for audit trails.

Method 1: Basic File Deployment

@echo off
setlocal

set "source=C:\Build\Output\MyApp"
set "destination=\\WebServer01\Deployments\MyApp"

if not exist "%source%\" (
    echo [ERROR] Source directory not found: %source%
    pause
    exit /b 1
)

echo Deploying to %destination%...

robocopy "%source%" "%destination%" /e /r:3 /w:5 /np

if %errorlevel% leq 3 (
    echo [SUCCESS] Deployment complete.
) else (
    echo [ERROR] Deployment failed. Exit code: %errorlevel%
    pause
    exit /b 1
)

pause

Understanding Robocopy Exit Codes

Robocopy uses a bitmask exit code, which differs from most commands:

Code Meaning
0 No files copied. Source and destination are synchronized.
1 Files were copied successfully.
2 Extra files or directories detected in destination.
3 Files copied + extras detected.
4 Mismatched files or directories found.
8+ Copy errors occurred.
16 Fatal error. No files copied.

Exit codes 0–3 are considered success. Codes 8 and above indicate failure.

Common Options

Option Description
/e Copy subdirectories, including empty ones
/mir Mirror mode: makes destination identical to source
/r:N Number of retries on failed copies
/w:N Wait time (seconds) between retries
/np No progress percentage (cleaner log output)
/log:file Write output to a log file
/mt:N Multi-threaded copy with N threads

Method 2: Mirror Deployment (Exact Sync)

Mirror mode deletes files in the destination that no longer exist in the source, making the deployment an exact replica:

@echo off
setlocal

set "source=C:\Build\Publish\WebApp"
set "destination=\\WebServer01\wwwroot\WebApp"

:: Generate locale-safe timestamp for the log filename
for /f "tokens=2 delims==" %%T in ('wmic os get LocalDateTime /value') do set "dt=%%T"
set "logfile=deploy_%dt:~0,4%%dt:~4,2%%dt:~6,2%.log"

if not exist "%source%\" (
    echo [ERROR] Source directory not found: %source%
    pause
    exit /b 1
)

echo =============================================
echo   MIRROR DEPLOYMENT
echo   Source: %source%
echo   Target: %destination%
echo =============================================
echo.

robocopy "%source%" "%destination%" /mir /r:3 /w:5 /np /log:"%logfile%"
set "result=%errorlevel%"

if %result% leq 3 (
    echo [SUCCESS] Mirror deployment complete.
) else (
    echo [ERROR] Deployment failed. Exit code: %result%
)

echo Log: %logfile%
pause

Method 3: Incremental Deployment (Changed Files Only)

Only copy files that have changed since the last deployment:

@echo off
setlocal

set "source=C:\Build\Output"
set "destination=\\AppServer\Deployments\CurrentRelease"

if not exist "%source%\" (
    echo [ERROR] Source directory not found: %source%
    pause
    exit /b 1
)

echo Deploying changed files only...

:: /e   = include subdirectories (including empty)
:: /xo  = exclude older files (only copy newer)
:: /xx  = exclude extra files in destination (don't delete)
robocopy "%source%" "%destination%" /e /xo /xx /r:3 /w:5 /np /ndl /nfl

set "result=%errorlevel%"

if %result% leq 3 (
    echo [SUCCESS] Incremental deployment complete.
) else (
    echo [ERROR] Failed. Exit code: %result%
)

pause

Method 4: Production Deployment with Pre/Post Steps

A complete deployment workflow with backup, deployment, and verification:

@echo off
setlocal enabledelayedexpansion

:: Configuration
set "app_name=WebApp"
set "source=C:\Build\Publish\%app_name%"
set "target=\\WebServer01\wwwroot\%app_name%"
set "backup=\\WebServer01\Backups\%app_name%"
set "logdir=DeployLogs"

:: Timestamp
for /f "tokens=2 delims==" %%T in ('wmic os get LocalDateTime /value') do set "dt=%%T"
set "timestamp=%dt:~0,4%%dt:~4,2%%dt:~6,2%_%dt:~8,2%%dt:~10,2%"
set "logfile=%logdir%\deploy_%timestamp%.log"

if not exist "%logdir%" mkdir "%logdir%"

echo =============================================
echo   PRODUCTION DEPLOYMENT
echo   App:     %app_name%
echo   Target:  %target%
echo   Time:    %timestamp%
echo =============================================
echo.

:: Step 1: Pre-flight check
echo [1/4] Pre-flight checks...
if not exist "%source%\" (
    echo   [ABORT] Source directory not found: %source%
    exit /b 1
)
echo   Source OK.

:: Step 2: Backup current deployment
echo [2/4] Backing up current deployment...
set "backup_dir=%backup%\%timestamp%"
if exist "%target%\" (
    robocopy "%target%" "%backup_dir%" /mir /r:2 /w:3 /np /ndl /nfl >nul 2>&1
    if !errorlevel! leq 3 (
        echo   Backup saved: %backup_dir%
    ) else (
        echo   [WARNING] Backup may be incomplete. Exit code: !errorlevel!
    )
) else (
    echo   No existing deployment to back up. Skipping.
)

:: Step 3: Deploy
echo [3/4] Deploying...
robocopy "%source%" "%target%" /mir /r:3 /w:5 /np /log:"%logfile%"
set "deploy_result=!errorlevel!"

if !deploy_result! leq 3 (
    echo   Deployment successful.
) else (
    echo   [ERROR] Deployment failed. Exit code: !deploy_result!
    echo.
    if exist "%backup_dir%\" (
        echo   Rolling back from backup...
        robocopy "%backup_dir%" "%target%" /mir /r:2 /w:3 /np >nul
        if !errorlevel! leq 3 (
            echo   [ROLLBACK] Restored from backup.
        ) else (
            echo   [CRITICAL] Rollback also failed. Manual intervention required.
        )
    ) else (
        echo   [WARNING] No backup available for rollback.
    )
    exit /b 1
)

:: Step 4: Verify
echo [4/4] Verifying...
set "verify_ok=1"
if exist "%target%\web.config" (
    echo   web.config present.
) else (
    echo   [WARNING] web.config missing.
    set "verify_ok=0"
)

echo.
echo =============================================
echo   DEPLOYMENT COMPLETE
echo   Log: %logfile%
echo =============================================

pause

Method 5: Multi-Server Deployment

Deploy to multiple servers sequentially:

@echo off
setlocal enabledelayedexpansion

set "source=C:\Build\Publish\WebApp"
set "share=Deployments\WebApp"

if not exist "%source%\" (
    echo [ERROR] Source directory not found: %source%
    pause
    exit /b 1
)

:: Define servers in a numbered array for names with special characters
set "server_count=3"
set "servers[0]=WebServer01"
set "servers[1]=WebServer02"
set "servers[2]=WebServer03"

echo =============================================
echo   MULTI-SERVER DEPLOYMENT
echo =============================================
echo.

set "success=0"
set "failed=0"

set /a last=server_count - 1
for /L %%i in (0,1,!last!) do (
    set "server=!servers[%%i]!"
    set "target=\\!server!\%share%"
    echo Deploying to !server! ^(!target!^)...

    robocopy "%source%" "!target!" /mir /r:3 /w:5 /np /ndl /nfl >nul
    set "result=!errorlevel!"

    if !result! leq 3 (
        echo   [OK]
        set /a success+=1
    ) else (
        echo   [FAIL] Exit code: !result!
        set /a failed+=1
    )
)

echo.
echo =============================================
echo   RESULTS: !success! succeeded, !failed! failed
echo =============================================

if !failed! gtr 0 exit /b 1
pause

Bandwidth Throttling

For deployments over WAN links or during business hours:

:: Limit bandwidth to avoid saturating the network
robocopy "%source%" "%destination%" /mir /r:3 /w:5 /ipg:100

:: /ipg:100 = inter-packet gap of 100ms (limits throughput)

For more precise control, use /mt (multi-threading) carefully:

:: Use 4 threads for faster LAN transfers
robocopy "%source%" "%destination%" /mir /r:3 /w:5 /mt:4

:: Note: /mt cannot be combined with /ipg

Common Mistakes

The Wrong Way: Not Checking Exit Codes Properly

:: WRONG - Treats exit code 1 (files copied) as an error
robocopy source dest /mir
if %errorlevel% neq 0 echo "FAILED!"
:: This reports failure even on successful copies

Output Concern: Robocopy exit code 1 means files were successfully copied. Only codes 8 and above indicate errors. Always use if %errorlevel% leq 3 for success checks, not if %errorlevel% equ 0.

The Wrong Way: Using /MIR on the Wrong Target

:: DANGEROUS - Mirrors to the entire wwwroot, deleting other sites
robocopy "C:\Build\MyApp" "\\Server\wwwroot" /mir
:: Deletes everything in wwwroot that is not in MyApp!

Always target a specific subdirectory, not a shared parent folder. /mir deletes anything at the destination that is not in the source.

Best Practices

  1. Check exit codes correctly: Codes 0–3 are success, 8+ are failures.
  2. Use /mir carefully: It deletes destination files not in source. Target specific directories.
  3. Always backup before deploying: Create a timestamped backup of the current deployment.
  4. Log every deployment: Use /log:file for audit trails and troubleshooting.
  5. Use /r and /w for resilience: Configure retries for network reliability.

Conclusion

Deploying files to remote servers via Robocopy in Batch Script leverages Windows' most powerful file synchronization tool. By understanding the bitmask exit codes, using mirror mode for clean deployments, implementing backup-and-rollback workflows, and deploying across multiple servers, administrators build reliable deployment pipelines that handle network interruptions gracefully and maintain full audit trails. Robocopy's incremental copy behavior ensures that only changed files are transferred, minimizing deployment time and network impact.

Navigation