Linha de comando - Algumas perguntas

0

Eu criei um arquivo em lotes para compactar itens selecionados em uma pasta. (O arquivo é colocado em 'Enviar para').

Se eu usar o seguinte código:

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

  • O nome do arquivo é o da pasta atual (correta).
  • Todos os arquivos são arquivados se eu selecionar um arquivo ou vários arquivos (errado).
  • As pastas selecionadas não são arquivadas (errado).

Se eu usar o seguinte código:

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

  • O nome do arquivo é o do arquivo no qual clico com o botão direito (correto).
  • Apenas esse arquivo é arquivado, mesmo que vários arquivos sejam selecionados (errado).

Como posso saber se um único item está selecionado ou mais?

Qual é a sintaxe da condição?

Como posso incluir pastas no arquivo?

Obrigado.

    
por Yaron 01.04.2014 / 23:12

1 resposta

0

Isso deve ajudá-lo ...

@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

O script verifica se o parâmetro passado é uma pasta ou arquivos individuais. Se arquivos, ele shift passará pelos parâmetros passados e processará cada arquivo individualmente. Esteja ciente de que você pode encontrar uma limitação no número de caracteres que podem ser passados como um argumento no prompt de comando ou arrastar e soltar, portanto, se muitos arquivos precisarem ser processados, basta processar a pasta inteira. Eu consegui passar mais de 50 arquivos sem problemas, mas os nomes deles eram relativamente curtos. Eu modifiquei o script ainda mais para verificar se há subdiretórios também.

Espero que ajude!

    
por 02.04.2014 / 01:30