batch-file - vers - script pour zipper un fichier




script batch pour compresser un dossier sans utiliser de logiciels externes (2)

J'ai un dossier avec la structure suivante

dossier sous-dossier (vide) sous-dossier fichier1.bat fichier2.bat fichier3.bat

Comment puis-je écrire un fichier batch pour compresser le contenu du dossier ci-dessus sans utiliser de logiciels externes comme winrar ou 7zip?

J'ai essayé le code ci-dessous. Mais il copiera le contenu dans le dossier temporaire spécifié sans le dossier vide et lors de la tentative de fermeture du dossier, il ne compressera que le fichier 1 et le fichier 2 et ignorera le reste du contenu.

Je voudrais pouvoir fermer le dossier comme il est sans affecter la structure.

Je n'ai pas pu trouver la raison du problème. Toute aide est appréciée.

set FILETOZIP=D:\OutputZipFiles\TestWorkDemo


set TEMPDIR=D:\OutputZipFiles\TempDir
rmdir %TEMPDIR%
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs

CScript  _zipIt.vbs  %TEMPDIR%  D:\OutputZipFiles\someArchive.zip

pause

Avec Shell.Application niveau 1 les dossiers vides sont toujours ignorés. Vous pouvez tester vous-même en sélectionnant un tas de fichiers incluant des dossiers vides et essayer de les coller dans un fichier zip via Windows Explorer (qui est réellement utilisé par l'application shell). Comme solution de contournement vous pouvez copier le dossier que vous voulez dans un autre dossier vide et zipper le nouveau dossier. Ensuite, vous aurez des répertoires vides de niveau 2 qui devraient être compressés.


Comme l'a dit npocmaka , Windows ne peut pas ajouter un seul dossier vide à un fichier zip, que ce soit par script ou par glisser-déposer.

Mais tu m'as inspiré. J'ai décidé d'écrire un utilitaire zip dans JScript, juste pour voir si je pouvais. Pour résoudre votre problème actuel, j'ai ajouté une vérification pour les dossiers vides. Si un dossier vide est rencontré, ce script créera un nouveau dossier enfant nommé "(vide)". C'était soit cela, ajouter un fichier de 0 octet, ou lancer une erreur et sauter l'ajout du dossier.

Quoi qu'il en soit, si vous voulez l'essayer, sauvegardez ce script avec une extension .bat et lancez-le. Certes, ce n'est pas aussi simple que votre VBscript, mais la journalisation, la gestion des erreurs et le timing sont meilleurs; et il peut compresser des fichiers individuels ainsi que des dossiers.

@if (@[email protected]) @end   /* JScript ignores this multiline comment

:: zip.bat file/folder1 [file/folder2 [file/folder3 etc...]] [-o outfile.zip]
:: creates a zip file

@echo off
setlocal enabledelayedexpansion

if "%~1"=="" (
    echo Usage: %~nx0 [-o outfile.zip] "file1 or folder1" ["file2 or folder2"] etc.
    echo If -o is not used, the zip file is named based on the first infile.
    goto :EOF
)

:: convert wildcards to individual filenames
for %%I in (%*) do (
    echo(%%I | findstr "[\*\?]" >NUL && (
        for /f "tokens=*" %%x in ('dir /b %%I') do set "args=!args! "%%~fx""
    ) || set "args=!args! "%%~I""
)

if "!args!" equ "" (
    echo(%* does not exist.
    goto :EOF
)
cscript /nologo /e:Jscript "%~f0" !args!

goto :EOF

:: end of batch portion / begin JScript portion */
var files = [], outfile,
    fso = new ActiveXObject("scripting.filesystemobject"),
    shl = new ActiveXObject("shell.application");

function chr(n) { return String.fromCharCode(n); }

for (var i=0; i<WSH.Arguments.length; i++) {
    if (WSH.Arguments(i).toLowerCase() == '-o') outfile = WSH.Arguments(++i);
    else files.push(WSH.Arguments(i));
}
if (!outfile) try { outfile = files[0].split(/[\/\\]/)[0] + '.zip'; }
catch(e) { outfile = 'archive.zip'; } // Probably never see this, but just in case.

WSH.Echo('Creating ' + outfile);

var zip = fso.CreateTextFile(outfile);
zip.Write("PK" + chr(5) + chr(6));
for (var i=18; i>0; i--) zip.Write(chr(0));
zip.Close()
zip = shl.NameSpace(fso.GetFile(outfile).Path);

for (var i=0; i<files.length; i++) {
    try {
        if (fso.FileExists(files[i])) {
            var file = fso.GetFile(files[i]);
        } else if (fso.FolderExists(files[i])) {
            var file = fso.GetFolder(files[i]);
            if (!shl.NameSpace(file.Path).Items().Count) {
                // Windows can't add an empty folder to a zip file, but
                // it *can* add a folder that contains an empty folder.
                shl.NameSpace(file.Path).NewFolder('(empty)');
            }
        } else {
            throw "Unable to locate " + files[i];
        }
        var folder = shl.NameSpace(file.ParentFolder + '\\'),
        zipThis = folder.ParseName(fso.GetFileName(files[i]));
    }
    catch(e) {
        var output = 'Skipping ' + files[i] + ': ';
        output += (typeof e === 'string') ? e : (
            e.description ? e.description : 'error ' + e.number + ' (unspecified error)'
        );
        WSH.Echo(output);
        files.splice(i--,1);
        continue;
    }
    WSH.StdOut.Write('Compressing ' + fso.GetFileName(file) + '... ');
    zip.CopyHere(zipThis);
    while (zip.Items().Count <= i) {
        WSH.Sleep(50);
    }
    WSH.Echo('Done.  (' + zip.Items().Count + ' of ' + files.length + ')');
}

if (!zip.Items().Count) {
    fso.DeleteFile(fso.GetFile(outfile));
    WSH.Echo('Zip file is empty.  Deleting.');
}

L'avantage d'utiliser JScript sur VBScript ici est qu'il n'est pas nécessaire de _zipIt.vbs écho à _zipIt.vbs . JScript offre la possibilité d'être évalué en ligne en tant qu'hybride d'un script batch. Votre vbscript que vous avez pillé a un autre problème, en ce sens qu'il appelle arbitrairement WScript.Sleep 2000 , quel que soit le temps nécessaire pour compléter la copie. Si vous copiez de gros fichiers, il se peut que 2 secondes ne soient pas suffisantes. Et c'est un gaspillage si vous copiez quelque chose de petit.





zip