如何将批处理文件与Total Commander GUI选定的文件/目录集成?

时间:2018-11-09 12:56:56

标签: batch-file buttonbar total-commander

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

使用引用的批处理文件,我可以为要备份的文件夹制作一个打包好的文件。

@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

我习惯使用Total Commander管理文件。

我使用按钮设置 Parameters: %s将批处理文件配置为TC按钮栏上的一个按钮。当活动项目是TC中的d:\doc\aatemp之类的文件夹时,我按下按钮,TC调用批处理文件,并将正确的文件夹名称传递给打包该文件夹的批处理文件。

对于一个以上我想做的文件夹。

因此,我使用按钮设置 Parameters (设置参数: %L)制作了另一个批处理文件。 TC使用%L在文件夹中为临时文件创建一个列表文件,其中包含选定文件的全限定名称/写入该列表文件的文件夹,并使用该临时列表文件的全名调用批处理文件。

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

我可以在命令pause之前通过命令WinRAR.exe看到所需的输出。

带有WinRAR.exe的命令行无法与列表文件一起使用。

1 个答案:

答案 0 :(得分:0)

此批处理文件的扩展版本可以由Total Commander调用,例如第一个参数是绝对或什至相对的文件夹路径(不以反斜杠结尾或以反斜杠结尾)以及具有绝对或相对的现有列表文件的名称文件路径。

@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

请阅读 rem 约克对该批处理文件的说明。

在Total Commander(简称:TC)中,可以通过仅使用工具栏中的一项来使用一个或多个文件夹路径调用此批处理文件。将具有完整路径的批处理文件指定为 Command ,将%L指定为 Parameters

TC使用将路径拖放为工具栏上该项目上的单个文件夹时的第一个参数传递批处理文件。

在工具栏上单击在活动窗格中处于活动状态的文件夹或在活动窗格中处于选中状态的一个或多个文件夹的项目,将导致执行批处理文件,而TC会临时创建具有活动文件夹或活动文件夹的完全限定文件夹名称的列表文件所选文件夹,但活动窗格中未选择任何内容,并且活动文件夹为..