I've created a batch file for zipping selected items in a folder. (The file is placed in 'Send to').

If I use the following code:

for %%* in (.) do set CurrentFolder=%%~n* "C:\Program Files\WinRar\WinRar" a -afzip "%CurrentFolder%.xpi"

  • The file name is that of the current folder (correct).
  • All files are archived whether I select one file or multiple files (wrong).
  • Selected folders are not archived (wrong).

If I use the following code:

set file=%~f1 "C:\Program Files\WinRar\WinRar" a -afzip "%file:~0,-4%.xpi" %1

  • The file name is that of the file on which I right click (correct).
  • Only that file is archived even if multiple files are selected (wrong).

How can I know if a single item is selected or more?

What's the condition syntax?

How can I include folders in the archive?

Thank you.

1 Answer 1


This should help you some...

@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...
::Check if folder is empty...
dir /b /a:-d "%_loc%" >nul 2>&1 && (echo  Non-empty folder!) || (echo Checking for sub-folders... && goto :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...
if "%~1"=="" goto :exit
echo Processing %~1 && echo.
goto :ProcFile
goto :exit

exit /b

The script checks if the passed parameter is a folder or individual files. If files, it will shift through the passed parameters and process each file individually. Be aware that you may hit a limitation in the number of characters that can be passed as an argument from the command prompt or drag and drop, so if a lot of files need to be processed, just process the entire folder. I've been able to pass 50+ files without a problem, but their names were relatively short. I've modified the script further to check for sub-directories as well.

Hope it helps!

  • Thank you so much. I really appreciate your help. I was notified about your reply about an hour ago, and I've been trying to integrate the zip command into your script.
    – Yaron
    Apr 3, 2014 at 1:01
  • I'm not a developer, and it's complicated for me. If I add "C:\Program Files\WinRar\WinRar" a -afzip "%_loc.xpi" to :ProcFile, each file is archived separately and this isn't what I want. Also, if I select all items and right-click on a file, folders are not archived. I'd be grateful for further assistance. *** Pressing Enter in the Comment section, submits the content and I have to start a new one (you can only edit 5 times).
    – Yaron
    Apr 3, 2014 at 1:18
  • @Yaron I will modify the script later on tonight.
    – JSanchez
    Apr 3, 2014 at 2:01
  • Thanks again. It's really kind of you. I've googled a bit and found that when adding the switch "-r", WinRar includes folders in the archive. So, apparently the following structure should work: If (one item is selected) set file=%~f1 "C:\Program Files\WinRar\WinRar" a -afzip "%file:~0,-4%.xpi" %1 Else for %%* in (.) do set CurrentFolder=%%~n* "C:\Program Files\WinRar\WinRar" a -afzip -r "%CurrentFolder%.xpi" *** Two problems: 1) How can I know how many items are selected? 2) If only a folder is selected, the code should be changed.
    – Yaron
    Apr 3, 2014 at 2:39
  • I'll use the name of the first item, or folder, as the archive name. Shouldn't be that difficult to implement. Famous last words. ;-)
    – JSanchez
    Apr 3, 2014 at 2:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.