我创建了一个批处理文件,用于压缩文件夹中选定的项目。(该文件放在“发送到”中)。
如果我使用以下代码:
for %%* in (.) do set CurrentFolder=%%~n* "C:\Program Files\WinRar\WinRar" a -afzip "%CurrentFolder%.xpi"
- 文件名是当前文件夹的文件名(正确)。
- 无论我选择一个文件还是多个文件(错误),所有文件都会被存档。
- 选定的文件夹未存档(错误)。
如果我使用以下代码:
set file=%~f1 "C:\Program Files\WinRar\WinRar" a -afzip "%file:~0,-4%.xpi" %1
- 该文件名是我右键单击的文件的名称(正确)。
- 即使选择了多个文件(错误),也只会存档该文件。
我如何知道是否选择了单个项目或更多项目?
条件语法是什么?
我如何将文件夹包含在档案中?
谢谢。
答案1
这应该会对你有所帮助...
@echo off
::Save passed parameter to a variable...
set _loc=%~1
::Check if passed parameter is a file/folder and process accordingly...
if exist "%~s1\*" (echo Processing all files in folder %_loc% && echo. && goto :ProcFolders) else (echo Processing files && echo. && goto :ProcFile)
goto :exit
::When passed parameter is a folder...
:ProcFolders
::Check if folder is empty...
dir /b /a:-d "%_loc%" >nul 2>&1 && (echo Non-empty folder!) || (echo Checking for sub-folders... && goto :CheckSubDir)
:CheckSubDir
dir /b /a:-d /s "%_loc%\*">nul 2>&1 && (echo. && echo Subfolders/files exist) || (echo. && echo No file or subfolders found && goto :exit)
::If folder has files or subfolders with files, continue here.
for /f %%g in ('dir /b /a:-d /s "%_loc%\*.*"') do echo Processing %%g && echo.
goto :exit
::When passed parameter is a file...
:ProcFile
if "%~1"=="" goto :exit
echo Processing %~1 && echo.
shift
goto :ProcFile
goto :exit
:exit
pause
exit /b
脚本检查传递的参数是文件夹还是单个文件。如果是文件,它将shift
检查传递的参数并单独处理每个文件。请注意,您可能会遇到从命令提示符或拖放中传递的参数的字符数限制,因此如果需要处理大量文件,只需处理整个文件夹即可。我能够毫无问题地传递 50 多个文件,但它们的名称相对较短。我进一步修改了脚本以检查子目录。
希望能帮助到你!