Un Batch per archiviare una cartella tramite 7z usando Invia A di Windows

Creare un bat per Windows che utilizza 7z per archiviare una cartella selezionata in Esplora File ed inviata tramite “invia a” del menu contestuale.

Forse servirà solo a me ma – spesso – mi trovo ad archiviare una cartella, prima di modificarla, per averne una copia di backup.

Però mi piace che il backup abbia un “codice di versione”, ovvero: se archivio la cartella “pippo” voglio che l’archivio si chiami “pippo_2024-11-02_2034.7z” dove, tutto quello che viene dopo “pippo”, è un codice progressivo che identifica data e ora di creazione del backup, così che siano sequenziali, in ordine.

Per farlo, procedere come segue:

1] Aprire la cartella del “Invia a:” di Windows; usare win+r e digitare:

shell:sendto

2] Nella cartella che si apre, creare un file di testo e rinominarlo come:

ARCHIVIA_CARTELLA.bat

3] Aprire in modifica il file di cui sopra ed incollare il seguente codice:

@echo off
setlocal enabledelayedexpansion

:: ******************************************************************
:: Script per creare l'archivio della cartella passato come parametro, usando
:: 7z ed associando un codice progressivo automaticamente.
::
:: Versione 202-11-02
:: budus@hotmail.it
:: ******************************************************************

set percorso7z=
set archive_code=
set archive_name=

:: Immagazzina la data e ora corrente.
for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (
	set anno=%%c
	set mese=%%b
	set giorno=%%a
)

for /f "tokens=1-2 delims=: " %%a in ('time /t') do (
	set ora=%%a
	set minuti=%%b
)

set archive_code=!anno!-!mese:~0,2!-!giorno:~0,2!_!ora:~0,2!!minuti:~0,2!

:: Verifica che il parametro sia una cartella e che esista.
if exist "%~1" (
	if not exist "%~1\*.*" (
		echo [I] Il percorso
		echo     "%~1"
		echo     e' una cartella vuota.
	) else (
		if exist "%~1\*" (
			echo [I] Il percorso
			echo     "%~1"
			echo     e' una cartella.
		) else (
			echo [I] Il parametro
			echo     "%~1"
			echo     risulta essere un file.
			goto end_with_error
		)
	)
) else (
	echo [I] Il parametro
	echo     "%~1"
	echo     non risulta essere una cartella.

	goto end_with_error
)

:: Estrapola il nome della cartella da archiviare.
for /f "delims=" %%a in ("%~1") do (
	set archive_name=%%~nxa
)

echo [I] Archiviazione della cartella:
echo     %1
echo     con il codice: %archive_code%
echo     nell'archivio: %archive_name%

for /f "delims=" %%a in ('where /R "%ProgramFiles%" 7z.exe') do (
	if not defined percorso7z set percorso7z=%%a
	goto end
)

:end
:: Se non è stato trovato 7z, emette errore.
if not defined percorso7z goto error__no7z

:: Esegue l'archiviazione usando 7z.
"%percorso7z%" a -bd -- "%archive_name%_%archive_code%" "%~1"
timeout 3
exit /B %errorlevel%


:error__no7z
echo [E] 7z non e' stato trovato in:
echo     %ProgramFiles%

:end_with_error
@pause
exit /B 1

4] Chiudere e salvare il file bat.

Ora è sufficiente usare il menu contestuale di Esplora File di Windows (per Windows 11 si rende necessario aprire le opzioni aggiuntive, cosa fattibile se si tiene premuto il tasto Maiuscola/Shift), quindi, “Invia a” e “ARCHIVIA_CARTELLA.bat”.

Nel bat ho messo diversi commenti, dovrebbe essere chiaro (sì, fino ad un certo punto, me ne rendo conto …) cosa fa ogni pezzo di codice. Se proprio siete curiosi di approfondire, potete chiedermelo o usare qualsiasi AI ed incollare la porzione di codice che vi lascia perplessi, se non l’intero script.

Nel caso in cui preferiate eliminare la cartella dopo l’archiviazione, potente modificare la riga:

"%percorso7z%" a -bd -- "%archive_name%_%archive_code%" "%~1"

in:

"%percorso7z%" a -bd -sdel -- "%archive_name%_%archive_code%" "%~1"

Autore: BuDuS

Disegnatore Meccanico, con la passione per l'Informatica. Come hobby, produco piccoli software di (in)utilità.