RobocopyExe.ArgumentCompleters.ps1



function RobocopyExeCompletion
{
            
    param($wordToComplete, $commandAst) 

    #
    # .SYNOPSIS
    #
    # Complete parameters and arguments to Robocopy.exe
    #
    function Get-RoboCopyArguments { 
        [PSCustomObject]@{Argument='/S'; ToolTip='copy Subdirectories, but not empty ones'}
        [PSCustomObject]@{Argument='/E'; ToolTip='copy subdirectories, including Empty ones'}
        [PSCustomObject]@{Argument='/Z'; ToolTip='copy files in restartable mode'}
        [PSCustomObject]@{Argument='/B'; ToolTip='copy files in Backup mode'}
        [PSCustomObject]@{Argument='/ZB'; ToolTip='use restartable mode; if access denied use Backup mode'}
        [PSCustomObject]@{Argument='/J'; ToolTip='copy using unbuffered I/O (recommended for large files)'}
        [PSCustomObject]@{Argument='/EFSRAW'; ToolTip='copy all encrypted files in EFS RAW mode'}
        [PSCustomObject]@{Argument='/SEC'; ToolTip='copy files with SECurity (equivalent to /COPY:DATS)'}
        [PSCustomObject]@{Argument='/COPYALL'; ToolTip='COPY ALL file info (equivalent to /COPY:DATSOU)'}
        [PSCustomObject]@{Argument='/NOCOPY'; ToolTip='COPY NO file info (useful with /PURGE)'}
        [PSCustomObject]@{Argument='/SECFIX'; ToolTip='FIX file SECurity on all files, even skipped files'}
        [PSCustomObject]@{Argument='/TIMFIX'; ToolTip='FIX file TIMes on all files, even skipped files'}
        [PSCustomObject]@{Argument='/PURGE'; ToolTip='delete dest files/dirs that no longer exist in source'}
        [PSCustomObject]@{Argument='/MIR'; ToolTip='MIRror a directory tree (equivalent to /E plus /PURGE)'}
        [PSCustomObject]@{Argument='/MOV'; ToolTip='MOVe files (delete from source after copying)'}
        [PSCustomObject]@{Argument='/MOVE'; ToolTip='MOVE files AND dirs (delete from source after copying)'}
        [PSCustomObject]@{Argument='/CREATE'; ToolTip='CREATE directory tree and zero-length files only'}
        [PSCustomObject]@{Argument='/FAT'; ToolTip='create destination files using 8.3 FAT file names only'}
        [PSCustomObject]@{Argument='/256'; ToolTip='turn off very long path (> 256 characters) support'}
        [PSCustomObject]@{Argument='/MON:'; ToolTip='MONitor source; run again when more than n changes seen'}
        [PSCustomObject]@{Argument='/MOT:'; ToolTip='MOnitor source; run again in m minutes Time, if changed'}
        [PSCustomObject]@{Argument='/RH:'; ToolTip='Run Hours - times when new copies may be started'}
        [PSCustomObject]@{Argument='/PF'; ToolTip='check run hours on a Per File (not per pass) basis'}
        [PSCustomObject]@{Argument='/IPG:'; ToolTip='Inter-Packet Gap (ms), to free bandwidth on slow lines'}
        [PSCustomObject]@{Argument='/SL'; ToolTip='copy symbolic links versus the target'}
        [PSCustomObject]@{Argument='/MT:'; ToolTip='Do multi-threaded copies with n threads (default 8)
            n must be at least 1 and not greater than 128
            This option is incompatible with the /IPG and /EFSRAW options
            Redirect output using /LOG option for better performance.'
}
        [PSCustomObject]@{Argument='/DCOPY:'; ToolTip='what to COPY for directories (default is /DCOPY:DA)
                    (copyflags : D=Data, A=Attributes, T=Timestamps)'
}
        [PSCustomObject]@{Argument='/NODCOPY'; ToolTip='COPY NO directory info (by default /DCOPY:DA is done)'}
        [PSCustomObject]@{Argument='/NOOFFLOAD'; ToolTip='copy files without using the Windows Copy Offload mechanism'}
        [PSCustomObject]@{Argument='/L'; ToolTip="List only - don't copy, timestamp or delete any files"}
        [PSCustomObject]@{Argument='/X'; ToolTip='report all eXtra files, not just those selected'}
        [PSCustomObject]@{Argument='/V'; ToolTip='produce Verbose output, showing skipped files'}
        [PSCustomObject]@{Argument='/TS'; ToolTip='include source file Time Stamps in the output'}
        [PSCustomObject]@{Argument='/FP'; ToolTip='include Full Pathname of files in the output'}
        [PSCustomObject]@{Argument='/BYTES'; ToolTip='Print sizes as bytes'}
        [PSCustomObject]@{Argument='/NS'; ToolTip="No Size - don't log file sizes"}
        [PSCustomObject]@{Argument='/NC'; ToolTip="No Class - don't log file classes"}
        [PSCustomObject]@{Argument='/NFL'; ToolTip="No File List - don't log file names"}
        [PSCustomObject]@{Argument='/NDL'; ToolTip="No Directory List - don't log directory names"}
        [PSCustomObject]@{Argument='/NP'; ToolTip="No Progress - don't display percentage copied"}
        [PSCustomObject]@{Argument='/ETA'; ToolTip='show Estimated Time of Arrival of copied files'}
        [PSCustomObject]@{Argument='/LOG:'; ToolTip='output status to LOG file (overwrite existing log)'}
        [PSCustomObject]@{Argument='/LOG+:'; ToolTip='output status to LOG file (append to existing log)'}
        [PSCustomObject]@{Argument='/UNILOG:'; ToolTip='output status to LOG file as UNICODE (overwrite existing log)'}
        [PSCustomObject]@{Argument='/UNILOG+:'; ToolTip='output status to LOG file as UNICODE (append to existing log)'}
        [PSCustomObject]@{Argument='/TEE'; ToolTip='output to console window, as well as the log file'}
        [PSCustomObject]@{Argument='/NJH'; ToolTip='No Job Header'}
        [PSCustomObject]@{Argument='/NJS'; ToolTip='No Job Summary'}
        [PSCustomObject]@{Argument='/UNICODE'; ToolTip='output status as UNICODE'}
        [PSCustomObject]@{Argument='/JOB:'; ToolTip='take parameters from the named JOB file'}
        [PSCustomObject]@{Argument='/SAVE:'; ToolTip='SAVE parameters to the named job file'}
        [PSCustomObject]@{Argument='/QUIT'; ToolTip='QUIT after processing command line (to view parameters).'}
        [PSCustomObject]@{Argument='/NOSD'; ToolTip='NO Source Directory is specified'}
        [PSCustomObject]@{Argument='/NODD'; ToolTip='NO Destination Directory is specified'}
        [PSCustomObject]@{Argument='/IF'; ToolTip='Include the following Files'}
        [PSCustomObject]@{Argument='/R:'; ToolTip='number of Retries on failed copies: default 1 million'}
        [PSCustomObject]@{Argument='/W:'; ToolTip='Wait time between retries: default is 30 seconds'}
        [PSCustomObject]@{Argument='/REG'; ToolTip='Save /R:n and /W:n in the Registry as default settings'}
        [PSCustomObject]@{Argument='/TBD'; ToolTip='wait for sharenames To Be Defined (retry error 67)'}
        [PSCustomObject]@{Argument='/A'; ToolTip='copy only files with the Archive attribute set'}
        [PSCustomObject]@{Argument='/M'; ToolTip='copy only files with the Archive attribute and reset it'}
        [PSCustomObject]@{Argument='/IA:'; ToolTip='Include only files with any of the given Attributes set'}
        [PSCustomObject]@{Argument='/XA:'; ToolTip='eXclude files with any of the given Attributes set'}
        [PSCustomObject]@{Argument='/XF file [file]...'; ToolTip='eXclude Files matching given names/paths/wildcards'}
        [PSCustomObject]@{Argument='/XD dirs [dirs]...'; ToolTip='eXclude Directories matching given names/paths'}
        [PSCustomObject]@{Argument='/XC'; ToolTip='eXclude Changed files'}
        [PSCustomObject]@{Argument='/XN'; ToolTip='eXclude Newer files'}
        [PSCustomObject]@{Argument='/XO'; ToolTip='eXclude Older files'}
        [PSCustomObject]@{Argument='/XX'; ToolTip='eXclude eXtra files and directories'}
        [PSCustomObject]@{Argument='/XL'; ToolTip='eXclude Lonely files and directories'}
        [PSCustomObject]@{Argument='/IS'; ToolTip='Include Same files'}
        [PSCustomObject]@{Argument='/IT'; ToolTip='Include Tweaked files'}
        [PSCustomObject]@{Argument='/MAX:'; ToolTip='MAXimum file size - exclude files bigger than n bytes'}
        [PSCustomObject]@{Argument='/MIN:'; ToolTip='MINimum file size - exclude files smaller than n bytes'}
        [PSCustomObject]@{Argument='/MAXAGE:'; ToolTip='MAXimum file AGE - exclude files older than n days/date'}
        [PSCustomObject]@{Argument='/MINAGE:'; ToolTip='MINimum file AGE - exclude files newer than n days/date'}
        [PSCustomObject]@{Argument='/MAXLAD:'; ToolTip='MAXimum Last Access Date - exclude files unused since n'}
        [PSCustomObject]@{Argument='/MINLAD:'; ToolTip='MINimum Last Access Date - exclude files used since n
                    (If n < 1900 then n = n days, else n = YYYYMMDD date)'
}
        [PSCustomObject]@{Argument='/XJ'; ToolTip='eXclude Junction points. (normally included by default)'}
        [PSCustomObject]@{Argument='/FFT'; ToolTip='assume FAT File Times (2-second granularity)'}
        [PSCustomObject]@{Argument='/DST'; ToolTip='compensate for one-hour DST time differences'}
        [PSCustomObject]@{Argument='/XJD'; ToolTip='eXclude Junction points for Directories'}
        [PSCustomObject]@{Argument='/XJF'; ToolTip='eXclude Junction points for Files'}    
    }

    Get-RoboCopyArguments | 
        Where-Object {$_.argument -like "$wordToComplete*"} |
        Sort-Object Argument |
        ForEach-Object {
            New-CompletionResult $_.Argument $_.ToolTip
        }
}


Register-ArgumentCompleter `
    -Command 'Robocopy' `
    -Native `
    -Description 'Complete parameters and arguments to robocopy.exe' `
    -ScriptBlock $function:RobocopyExeCompletion