Search code examples
batch-filebuttonbartotal-commander

How to integrate batch file with Total Commander GUI selected files / directories?


Reference: How to create a RAR archive with date of the archived folder in archive file name?

With the referenced batch file I can make a good packed file for the folder I want to backup.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FolderToBackup=%1"

rem Get last modification date/time of the folder to backup
rem in region dependent format which is YYYY-MM-DD hh:mm.
for %%I in ("%FolderToBackup%") do set "FolderTimeStamp=%%~tI"

rem Get from this date/time string just the year, month
rem and day of month from the date without the hyphens.
set "FolderTimeStamp=%FolderTimeStamp:~0,4%%FolderTimeStamp:~5,2%%FolderTimeStamp:~8,2%"

rem Compress the folder to backup into a RAR archive file with
rem last modification date of folder used in archive file name.
"%Programw6432%\WinRAR\WinRAR.exe" a -ac -cfg- -dh -ep1 -ibck -m4 -oh -ol -os -ow -r -ts -y -- %FolderTimeStamp%_%FolderToBackup%.rar "%FolderToBackup%"

rem Restore the environment as set before usage of command SETLOCAL at top.
endlocal

I am used to manage my files with Total Commander.

I configured the batch file to be a button on the button bar of TC with the button setting Parameters: %s. When the active item is a folder like d:\doc\aatemp in TC, I press the button and TC calls the batch file and passes the correct folder name to the batch file which packs the folder.

For more than one folder I want to do as above.

So I made another batch file with the button setting Parameters: %L. TC creates a list file in folder for temporary files on using %L with full qualified names of selected files / folders written into this list file and calls the batch file with full name of this temporary list file.

rem @echo off
rem Processing of %L or %WL
REM setlocal EnableExtensions DisableDelayedExpansion
setlocal enabledelayedexpansion
rem for /f "usebackq delims=" %%s in (`type %1`) do echo "%%s"
for /f "usebackq delims=" %%s in (`type %1`) do (
echo "%%s"
rem pause
rem

set FolderToBackup=%%s
echo !FolderToBackup!
REM pause

if "!FolderToBackup:~-1!"=="\" set "FolderToBackup=!FolderToBackup:~0,-1!"
echo !FolderToBackup!
pause

rem Get last modification date/time of the folder to backup
rem in region dependent format which is YYYY-MM-DD hh:mm.
for %%I in ("!FolderToBackup!") do set "FolderTimeStamp=%%~tI"
echo !FolderTimeStamp!
pause

rem Get from this date/time string just the year, month
rem and day of month from the date without the hyphens.
set "FolderTimeStamp=!FolderTimeStamp:~0,4!!FolderTimeStamp:~5,2!!FolderTimeStamp:~8,2!"
echo !FolderTimeStamp!
pause

rem Compress the folder to backup into a RAR archive file with
rem last modification date of folder used in archive file name.
rem "!Programw6432!\WinRAR\WinRAR.exe" a -ac -cfg- -dh -ep1 -ibck -m4 -oh -ol -os -ow -r -ts -y -- !FolderTimeStamp!_!FolderToBackup!.rar !FolderToBackup!
c:\Program Files\WinRAR\WinRAR.exe a -ac -cfg- -dh -ep1 -ibck -m4 -oh -ol -os -ow -r -ts -y -- !FolderTimeStamp!_!FolderToBackup!.rar !FolderToBackup!

)
rem Restore the environment as set before usage of command SETLOCAL at top.
endlocal

I can see with command pause the output as I want before the command line with WinRAR.exe.

The command line with WinRAR.exe cannot work with the list file as I want it.


Solution

  • This extended version of the batch file can be called for example by Total Commander with first argument being an absolute or even a relative folder path not ending or ending with a backslash as well as name of an existing list file with absolute or relative file path.

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    set "FolderToBackup="
    if "%~1" == "" goto ErrorArg
    set "FolderToBackup=%~f1"
    
    rem Does the argument string not end with a backslash for a folder path?
    if not "%FolderToBackup:~-1%" == "\" goto IsFolder
    
    rem The argument string is a folder path.
    rem Does the specified folder not exist?
    if not exist "%FolderToBackup%" goto ErrorArg
    
    rem The specified folder exists and is archived now on not being a root folder.
    call :BackupFolder
    goto EndBatch
    
    :IsFolder
    rem Does the argument without trailing backslash not specify a folder?
    if not exist "%FolderToBackup%\" goto ExistsFile
    
    rem The argument is a folder path.
    rem This folder is archived now on not being a root folder.
    call :BackupFolder
    goto EndBatch
    
    :ExistsFile
    rem The argument string is definitely not a folder path.
    rem Does the argument string not specify an existing file?
    if not exist "%FolderToBackup%" goto ErrorArg
    
    rem The argument string specifies a file which is hopefully a list file.
    set "ListFile=%FolderToBackup%"
    for /F "usebackq eol=| delims=" %%I in ("%ListFile%") do (
        set "FolderToBackup=%%~I"
        call :BackupFolder
    )
    goto EndBatch
    
    :BackupFolder
    rem Remove the backslash at end of folder path if there is one at all.
    if "%FolderToBackup:~-1%" == "\" set "FolderToBackup=%FolderToBackup:~0,-1%"
    rem Exit the subroutine if the folder path was root folder of a drive.
    if "%FolderToBackup:~2%" == "" goto :EOF
    rem Does the folder to backup not exist? This skips also files!
    if not exist "%FolderToBackup%\" goto :EOF
    
    for %%J in ("%FolderToBackup%") do set "FolderName=%%~nxJ" & set "FolderPath=%%~dpJ"
    
    rem Get last modification date/time of the folder to backup
    rem in region dependent format which is YYYY-MM-DD hh:mm.
    for %%J in ("%FolderToBackup%") do set "FolderTimeStamp=%%~tJ"
    
    rem Get from this date/time string just the year, month
    rem and day of month from the date without the hyphens.
    set "FolderTimeStamp=%FolderTimeStamp:~0,4%%FolderTimeStamp:~5,2%%FolderTimeStamp:~8,2%"
    
    rem Compress the folder to backup into a RAR archive file with
    rem last modification date of folder used in archive file name.
    "C:\Program Files\WinRAR\WinRAR.exe" a -ac -cfg- -dh -ep1 -ibck -m4 -oh -ol -os -ow -r -ts -y -- "%FolderPath%%FolderTimeStamp%_%FolderName%.rar" "%FolderToBackup%"
    goto :EOF
    
    :ErrorArg
    if defined FolderToBackup (echo %~f0 "%FolderToBackup%") else echo %~f0
    echo/
    echo Error: This batch file must be started with path of an existing folder
    echo        or the name of a list file with one or more folder paths. It is
    echo        not possible to use this batch file with root folder of a drive.
    echo/
    pause
    
    :EndBatch
    rem Restore the environment as set before usage of command SETLOCAL at top.
    endlocal
    

    Please read the remarks for explanation of this batch file.

    In Total Commander (short: TC) this batch file can be called with one or more folder paths by using only one item in toolbar. Specify as Command the batch file with full path and %L as Parameters.

    TC executes the batch file with the folder path passed as first argument on dragging & dropping a single folder on this item in toolbar.

    Clicking on item in toolbar with a folder active in active pane or with one or more folders selected in active pane results in execution of the batch file with TC creating temporarily the list file with the full qualified folder names of either active folder or the selected folder(s), except there is nothing selected in active pane and active is ...