web-dev-qa-db-fra.com

Comment pouvez-vous compresser ou décompresser le script en utilisant UNIQUEMENT les fonctionnalités intégrées de Windows?

Sous Windows, vous pouvez compresser certains fichiers en

clic droit → Envoyer à dossier compressé (zippé)

Décompressez en double-cliquant sur le fichier .Zip et extrayez les fichiers.

Existe-t-il un moyen d'appliquer ces capacités à partir d'un script (fichier .bat) sans avoir à installer de logiciel tiers?

266
Roee Gavirel

En 2013, ce n'était pas possible. Microsoft n'a fourni aucun exécutable pour cela.

Voir ce lien pour un moyen VBS de le faire. https://superuser.com/questions/201371/create-Zip-folder-from-the-command-line-windows

À partir de Windows 8, .NET Framework 4.5 est installé par défaut, avec System.IO.Compression.ZipArchive et PowerShell disponibles, vous pouvez écrire des scripts pour y parvenir, voir https: //. stackoverflow.com/a/26843122/71312

76
Diryboy

Pour développer la solution PowerShell de Steven Penny, vous pouvez l’incorporer dans un fichier de commandes en appelant powershell.exe comme suit:

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.Zip', 'bar'); }"

Comme Ivan Shilo l'a dit, cela ne fonctionnera pas avec PowerShell 2, il nécessite PowerShell version 3 ou supérieure et .NET Framework 4.

167
Jason Duffett

À compter de . NET 4.5 , PowerShell peut le faire:

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.Zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.Zip', 'bar')

Pour les deux dernières lignes, bar et foo peuvent être remplacés par le nom que vous souhaitez attribuer au dossier, ou quel que soit le nom du dossier préexistant. foo.Zip dans les deux cas, sert de fichier Zip à enregistrer ou à décompresser.

152
Steven Penny

Si vous avez installé Java, vous pouvez compresser dans une archive Zip à l'aide de la commande jar:

jar -cMf targetArchive.Zip sourceDirectory

c = crée un nouveau fichier archive.

M = Spécifie qu'un fichier manifeste ne doit pas être ajouté à l'archive.

f = Indique le nom du fichier cible.

123
Noam Manos

PowerShell 5.0

De Microsoft.PowerShell.Archive vous pouvez utiliser:

Par exemple.:

  • Créez _result.Zip_ à partir du dossier entier Test:

    _Compress-Archive -Path C:\Test -DestinationPath C:\result
    _
  • Extrayez le contenu de _result.Zip_ dans le dossier Test spécifié:

    _Expand-Archive -Path result.Zip -DestinationPath C:\Test
    _
67
ROMANIA_engineer

Ce n'est pas exactement un zip, mais le seul moyen de compresser un fichier à l'aide des outils Windows est:

makecab <source> <dest>.cab

Pour décompresser:

expand <source>.cab <dest>

Exemple avancé (de ss64.com):

Create a self extracting archive containing movie.mov:
C:\> makecab movie.mov "temp.cab"
C:\> copy /b "%windir%\system32\extrac32.exe"+"temp.cab" "movie.exe"
C:\> del /q /f "temp.cab"

Plus d'informations: makecab , développer , tilisations avancées de makecab

37

tilisation de 7-Zip:

Zip: vous avez un dossier foo et vous voulez le compresser à myzip.Zip

"C:\Program Files\7-Zip\7z.exe" a  -r myzip.Zip -w foo -mem=AES256

Décompressez: vous voulez le décompresser (myzip.Zip) dans le répertoire en cours (./)

"C:\Program Files\7-Zip\7z.exe" x  myzip.Zip  -o./ -y -r
27
Monir

J'ai cherché à répondre à cette question précise et d'après mes recherches, la réponse de DiryBoy semble être exacte.

J'ai trouvé que le programme compact.exe compresse les fichiers mais pas pour créer un fichier fortement compressé (ou un ensemble de fichiers). Cette option est similaire à celle que vous obtenez lorsque vous cliquez avec le bouton droit sur une lettre de lecteur ou une partition dans Windows. Vous avez la possibilité de nettoyer (supprimer les fichiers temporaires, etc.) ainsi que de compresser les fichiers. Les fichiers compressés sont toujours accessibles mais ne le sont que pour créer de l'espace sur un lecteur disposant de peu d'espace.

J'ai aussi trouvé compress.exe que j'avais sur mon ordinateur. Ce n'est pas natif sur la plupart des machines Windows et fait partie du kit de ressources 2003. Cela crée un fichier compressé mais il ressemble beaucoup plus aux fichiers d'un disque d'installation Windows (le caractère de soulignement est le dernier caractère de l'extension ou du nom du fichier). Et la commande extract.exe extrait ces fichiers.

Toutefois, le mantra est le suivant: si cela peut être fait de manière native via l'interface graphique, il existe probablement un moyen de le faire via batch, .vbs ou un autre type de script dans la ligne de commande. Comme Windows avait l'option "envoyer à" pour créer un fichier Zip, je savais qu'il devait y avoir un moyen de le faire via une ligne de commande et j'ai trouvé quelques options.

Voici un excellent lien qui montre comment compresser un fichier à l’aide de commandes natives Windows.

https://superuser.com/questions/110991/can-you-Zip-a-file-from-the-command-Prompt-using-only-windows-built-in-capabili

Je l'ai testé avec un répertoire contenant plusieurs fichiers et dossiers imbriqués et cela a parfaitement fonctionné. Suivez simplement le format de la ligne de commande.

Il existe également un moyen de décompresser les fichiers via une ligne de commande que j'ai également trouvée. Une solution consiste à ouvrir une fenêtre de l’explorateur indiquant le contenu du fichier compressé. Certains d'entre eux utilisent également Java, qui n'est pas nécessairement natif de Windows, mais qui est si courant qu'il semble presque l'être.

https://superuser.com/questions/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

Comment décompresser un fichier en utilisant la ligne de commande?

8
LostUser

Vous pouvez utiliser un script VBScript intégré dans un fichier BAT. Ce code fonctionne sur un PATH relatif.

Il n'est pas nécessaire d'utiliser des outils tiers ou des dépendances. Il suffit de définir SOURCEDIR et OUTPUTZIP.

Nom de fichier: ZipUp.bat

echo Set fso = CreateObject("Scripting.FileSystemObject") > _zipup.vbs
echo InputFolder = fso.GetAbsolutePathName(WScript.Arguments.Item(0)) >> _zipup.vbs
echo ZipFile = fso.GetAbsolutePathName(WScript.Arguments.Item(1)) >> _zipup.vbs

' Create empty Zip file.
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipup.vbs

echo Set objShell = CreateObject("Shell.Application") >> _zipup.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipup.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipup.vbs

echo ' Keep script waiting until compression is done
echo Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count >> _zipup.vbs
echo     WScript.Sleep 200 >> _zipup.vbs
echo Loop >> _zipup.vbs

CScript  _zipup.vbs  %SOURCEDIR%  %OUTPUTZIP%

del _zipup.vbs

Exemple d'utilisation

SET SOURCEDIR=C:\Some\Path
SET OUTPUTZIP=C:\Archive.Zip
CALL ZipUp

Vous pouvez également paramétrer ce fichier en remplaçant la ligne CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP% par CScript _zipup.vbs %1 %2, auquel cas il est encore plus facile de l'appeler en appelant simplement CALL ZipUp C:\Source\Dir C:\Archive.Zip.

7
PodTech.io

Open source est votre ami :-)

Voici le unzip : http://gnuwin32.sourceforge.net/packages/unzip.htm

Il existe également une commande Zip: http://gnuwin32.sourceforge.net/packages/Zip.htm

Les fichiers binaires suffisent.

3
JanBorup

Si vous avez besoin de faire cela dans le cadre d'un script, le meilleur moyen consiste à utiliser Java. En supposant que le répertoire bin se trouve dans votre chemin (dans la plupart des cas), vous pouvez utiliser la ligne de commande:

jar xf test.Zip

Si Java n'est pas sur votre chemin, faites-le directement référence:

C:\Java\jdk1.6.0_03\bin>jar xf test.Zip
2
eddyoc

Vous dites que vous essayez de le faire sans logiciel tiers. Je ne sais pas si vous envisageriez un logiciel "tiers" .NET.

Mais vous pouvez créer votre propre utilitaire de ligne de commande dans .NET. Cela ne devrait pas nécessiter plus que quelques lignes de code.

Classe ZipFile

1
NL3294

J'ai un problème avec toutes ces solutions. Ils ne sont pas pas exactement , et ils créent tous des fichiers qui présentent une légère différence de taille par rapport à la RMB --> send to --> compressed (zipped) folder lorsqu'ils sont créés à partir du même dossier d'origine. La différence de taille la plus proche que j'ai eue est de 300 Ko (script> manuel), réalisée avec:

powershell Compress-Archive -Path C:\sourceFolder -CompressionLevel Fastest -DestinationPath C:\destinationArchive.Zip

(Remarquez le - CompressionLevel . Il y a trois valeurs possibles : Le plus rapide, Pas de compression & Optimal, (Par défaut: Optimal))

Je voulais créer un fichier .bat qui compresserait automatiquement un dossier de plug-ins WordPress sur lequel je travaille, dans une archive .Zip, afin que je puisse le télécharger dans le site WordPress et tester le plugin.

Mais pour une raison quelconque, cela ne fonctionne avec aucune de ces compressions automatiques, , mais cela fonctionne avec la compression manuelle RMB, que je trouve vraiment étrange.

Et les fichiers .Zip générés par script cassent les plugins WordPress au point qu’ils ne peuvent plus être activés et qu’ils ne peuvent pas non plus être supprimés de WordPress. Je dois SSH dans le "dos" du serveur et supprimer les fichiers du plugin téléchargés eux-mêmes, manuellement. Bien que les fichiers générés manuellement par RMB fonctionnent normalement.

0
Sebastian Norr