Zippear archivos en vbs/batch/js

Iniciado por Novlucker, 4 Agosto 2008, 03:30 AM

0 Miembros y 1 Visitante están viendo este tema.

Novlucker

Buenas a todos...

A quienes les gusta el scripting en batch, seguro se han preguntado alguna vez, como zippear un archivo desde el propio lenguaje, y la solución, ha sido siempre, buscar las carpetas de winzip o winrar en el sistema, para utilizar las aplicaciones de línea de comando que estos programas incluyen, lo que permitía comprimir un archivo, pero siempre dependiendo de un programa ajeno  :-\
El caso es que Win XP trae incorporado por defecto esta posibilidad ("enviar a carpeta comprimida en zip"), pero desde scripting no parecía posible acceder a ella  :(
El caso es que... en vbscript si se puede  :D, y es casi el mismo método que se utiliza en VB, por lo que sería posible zippear un archivo, utilizando scripting, y sin depender de ningún otro soft  ;D
El método lo encontre googleando mucho, y haciendo una que otra prueba, he simplificado el código, y lo he comentado para que sea entendible ,y como verán... es realmente corto.. y he aqui... el code....  :P

Código (vb) [Seleccionar]
set objfso = createobject("scripting.filesystemobject")
'creamos el objeto que se encarga de manejar archivos

set nzip = objfso.opentextfile("c:\nzip.zip",2,true)
'creamos el archivo zip, en este caso nzip.zip en el directorio C:
nzip.write "PK" & chr(5) & chr(6) & string(18,chr(0))
nzip.close
'escribimos el encabezado del archivo, que hace que se reconozcan como zip

set objsap = createobject("shell.application")
'creamos un nuevo objeto

objsap.namespace("c:\nzip.zip").copyhere wscript.scriptfullname
'dentro de nuestro zip, copiamos el archivo, en este caso, el propio script
wscript.sleep 2000
'agregamos una pequeña espera para que de tiempo a copiarse el archivo en el zip

Como se ve, el code es muy simple ,pero totalmente efectivo... en el caso de no poder escribir en C:, cambien c:\nzip.zip por una ruta válida para poder probarlo....

Se que aquí la mayoría opta por batch, así que sería cuestión de crear el vbs por medio de echo, y cambiando wscript.scriptfullname por %0, así se comprimiría el *.bat  ;)

Eso fue todo... espero les sirva, creo que si porque más de una vez he leído a usuarios preguntado como comprimir archivos desde un script, y la respuesta siempre ha sido la misma... "buscar el directorio de winzip/winrar......."

Saludos  ;D
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

leogtz

Claro que sirve :), gracias por el aporte.

Tal ves haya una forma de hacerlo en Batch, tal ves...

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Novlucker

CitarTal ves haya una forma de hacerlo en Batch, tal ves...

Quizás si... por el momento, y como comenté antes, la opción es más o menos esta....

Código (DOS) [Seleccionar]
echo set ^objfso = createobject("scripting.filesystemobject") >> %temp%\zippear.vbs
echo set ^nzip = objfso.opentextfile("c:\nzip.zip",2,true) >> %temp%\zippear.vbs
echo nzip.write "PK" ^& chr(5) ^& chr(6) ^& string(18,chr(0)) >> %temp%\zippear.vbs
echo nzip.close >> %temp%\zippear.vbs
echo ^set objsap = createobject("shell.application") >> %temp%\zippear.vbs
echo objsap.namespace("c:\nzip.zip").copyhere %0 >> %temp%\zippear.vbs
echo wscript.sleep 2000 >> %temp%\zippear.vbs
start /wait %temp%\zippear.vbs
del %temp%\zippear.vbs


;D
Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

wizard_0

Muy  weno  excelente!!!   
salu2-->

leogtz

Novlucker

Si te sirve de algo, asi se puede abrir un Zip en el navegador :
Rundll32.exe zipfldr.dll, RoutheTheCall prueba.zip

Saludos.
:)
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Novlucker

#5
Cita de: RockoX en  4 Agosto 2008, 08:32 AM
Novlucker
Si te sirve de algo, asi se puede abrir un Zip en el navegador :
Rundll32.exe zipfldr.dll, RoutheTheCall prueba.zip

Si, conocía el método, también lo había encontrado desde hace algún tiempo, y en base a ese, intenté de todos los modos comprimir un archivo, pero por lo visto, solo permite descomprimir  :-\, como es posible que pueda descomprimir, pero no comprimir? en todo google no hay una manera de hacer esto con Rundll32.exe zipfldr.dll!!!  :-X

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

leogtz

Exactamente, haller que pusiste el code, pense que debia de haber una forma de comprimir o descomprimir en Batch, y realmente busque durante varias horas.

Y llegue a ver codes que usaban el zipfldr.dll, dynazip.dll (Algunas mas) pero nada de nada  :-\
Solo lo usaban para abrir un .zip con el Explorer. Pero nunca para comprimir o descomprimir.


Bueno luego sigo buscando.  :xD

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

BenRu

En batch si no recuerdo mal, se puede.

Simplemente le pasas un comando al winrar...

Miren el readme de winrar.



Un saludo

Novlucker

#8
CitarA quienes les gusta el scripting en batch, seguro se han preguntado alguna vez, como zippear un archivo desde el propio lenguaje, y la solución, ha sido siempre, buscar las carpetas de winzip o winrar en el sistema, para utilizar las aplicaciones de línea de comando que estos programas incluyen, lo que permitía comprimir un archivo, pero siempre dependiendo de un programa ajeno....

Es que la idea es justamente, no depender de otro programa
:rolleyes:

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

SmartGenius

Oye Novlucker, yo siempre tuve esa duda y tambien busque info... llegue hasta unos foros chinos de scripting y esto fue lo que saque, pero no lo se manejar bien....


@if(0)==(0) ECHO On
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end
var Usage="Uso: MakeZIP.CMD ZIPfile files...";
if(WScript.Arguments.Count()<2){
  WScript.Echo(Usage);
  WScript.Quit();
}
var ZIPfile=WScript.Arguments.Item(0);
var fso=new ActiveXObject("Scripting.FileSystemObject");
if(fso.GetExtensionName(ZIPfile).toUpperCase()!="ZIP"){
  WScript.Echo("Extension de Nombre Invalido -",ZIPfile);
  WScript.Quit();
}
if(!fso.FileExists(ZIPfile)){
  var File=fso.CreateTextFile(ZIPfile,false);
  File.Write("PK" + String.fromCharCode(5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0));
  File.Close();
}
var wShell=new ActiveXObject("WScript.Shell");
var vbYesNoCancel=3;
var vbQuestion=32;
var vbYes=6;
var vbNo=7;
var vbCancel=2;
var Shell=new ActiveXObject("Shell.Application");
var File=fso.GetFile(ZIPfile);
var zFolder=Shell.NameSpace(File.Path);
F1:for(var k=1;k<WScript.Arguments.Count();k++){
  var Path=WScript.Arguments.Item(k);
  var FileName=fso.GetFileName(Path);
  var sFolderItem=Shell.NameSpace(fso.GetAbsolutePathName(Path)+'\\..\\').ParseName(FileName);
  if(!sFolderItem){
    WScript.Echo(Path,"- No encontrado.");
    break;
  }
  W1:while(true){
    var zFolderItem=zFolder.ParseName(FileName);
    if(!zFolderItem){
      var ModifyDate=new Date(File.DateLastModified);
      zFolder.CopyHere(sFolderItem);
      while(ModifyDate.valueOf()==new Date(File.DateLastModified).valueOf()) WScript.Sleep(100);
      break;
    }else{
      var Ans=wShell.PopUp("aaaaaaaaaa:\n\n"+
                 '"' + FileName + '"\n\nbbbbbbbbbb?',
                 0,"cccccc",vbYesNoCancel+vbQuestion);
      switch(Ans){
      case vbYes:
        zFolderItem.InvokeVerb("delete");
        break;
      case vbNo:
        break W1;
      case vbCancel:
        break F1;
      }
    }
  }
}
WScript.Quit();


Aun no se como funciona le code, o si tiene algun problema, es que lo encontre por ahi en un foro CHINO y pues queria entender un poco la sintaxis, se que es mezcla de comando Batch o CMD y de vbs, y pues nos crea un archivo ZIP con un listado de archivos que le demos...

Tu que sabes bien de VBS puedes estudiarlo y hasta podria modificarse... ;D

Espero sirva..

Saludos.