2011-05-19 25 views
9

Para ahorrar ancho de banda/espacio así como prevenir intromisiones accidentales, los archivos de instalación para un producto de base de datos (llámelo Ajax) tienen se ha comprimido (llame a ese archivo "AJAX_Install_Files.ZIP). Me gustaría que Inno-Setup" instale "(es decir, copie) el archivo AJAX_Install_Files.ZIP en el destino y luego descomprima los archivos en la misma carpeta donde está el archivo. Se encuentra el archivo ZIP. Inno Setup ejecutará un programa posterior para ejecutar la instalación del producto "Ajax".Cómo obtener la instalación de Inno para descomprimir un archivo que instaló (todo como parte del proceso de instalación)

He revisado la documentación, las preguntas frecuentes y la KB en el Inno Setup website, y esto no parece posible que no sea escribir un script de Pascal (código): ¿sería correcto o hay alguna solución alternativa? iones?

Respuesta

5

Respondí un muy similar question y se aplican algunos de los detalles.

Me gustaría preguntar por qué necesita un archivo ZIP de los contenidos? Yo personalmente colocaría los archivos sin comprimir en la configuración. Entonces tendría dos entradas [category], una para la aplicación y otra para la información. Predeterminado tanto el be checked.

Esto permitiría a los usuarios instalar un nuevo conjunto de datos si fuera necesario en una fecha posterior.

Si realmente desea un archivo ZIP y desea que sea fácil, puede enviar los archivos zip y los archivos sin comprimir en la misma configuración.

Actualización:

Por archivos predeterminados que consiguen colocar en su setup.exe son compressed.

También puede hacer que los archivos se extraigan a una ubicación temporal para que pueda ejecutar su aplicación de instalación y luego eliminarlos.

[Files] 
Source: "Install1.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall; 
Source: "Install2.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall; 
+2

¿Por qué una postal de los contenidos - porque así es como se suministran los archivos para mí, y creo que es * mucho * es más fácil tratar con un único archivo .ZIP en lugar de los más de 2.000 archivos guardados en el archivo .ZIP. Este archivo .ZIP es la instalación y los datos de un solo programa de instalación de un programa múltiple que estoy intentando automatizar. Una vez que obtengo los archivos "instalados" (realmente copiados) en la máquina de destino, entonces voy a iniciar el programa de instalación de la base de datos y usar otra herramienta de automatización para instalarlo automáticamente. Entonces, en última instancia, necesito repetir el proceso anterior muchas (> 2) veces. –

+0

si no despliego el archivo zip? – none

18

Puede utilizar una herramienta de línea de comandos externa para descomprimir el archivo, ver here por ejemplo. Ponerlo en su sección [Archivos]:

[Files] 
Source: "UNZIP.EXE"; DestDir: "{tmp}"; Flags: deleteafterinstall 

Entonces lo haga en su sección [Run], así:

[Run] 
Filename: "{tmp}\UNZIP.EXE"; Parameters: "{tmp}\ZipFile.ZIP -d C:\TargetDir" 

(usted probablemente querrá llevar a su directorio de destino de un guión variable, por lo que hay que hacer un poco más de trabajo)

+0

¿Hay alguna forma de ocultar los registros mostrados en la pantalla? –

+0

@TalyssondeCastro Use 'Flags: runhidden'. –

+0

Correcto, PERO necesitaba agregar comillas alrededor de .zip y dir de destino. Para hacer esto, debe escapar con otro conjunto de comillas para que parezca: "" "{tmp} \ ZipFile.ZIP" "-d" "C: \ TargetDir" "" –

3

Puede usar el shell Folder.CopyHere method para extraer un ZIP.

const 
    SHCONTCH_NOPROGRESSBOX = 4; 
    SHCONTCH_RESPONDYESTOALL = 16; 

procedure UnZip(ZipPath, TargetPath: string); 
var 
    Shell: Variant; 
    ZipFile: Variant; 
    TargetFolder: Variant; 
begin 
    Shell := CreateOleObject('Shell.Application'); 

    ZipFile := Shell.NameSpace(ZipPath); 
    if VarIsClear(ZipFile) then 
    RaiseException(Format('ZIP file "%s" does not exist or cannot be opened', [ZipPath])); 

    TargetFolder := Shell.NameSpace(TargetPath); 
    if VarIsClear(TargetFolder) then 
    RaiseException(Format('Target path "%s" does not exist', [TargetPath])); 

    TargetFolder.CopyHere(ZipFile.Items, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL); 
end; 

Tenga en cuenta que las banderas SHCONTCH_NOPROGRESSBOX y SHCONTCH_RESPONDYESTOALL trabajo en Windows Vista y versiones posteriores.


El código está inspirado en el InnoUnzip (unzipper.dll) DLL. Pero el código de la DLL es tan trivial, que puede implementarlo de manera nativa en Pascal Script (como se muestra arriba).


Para un ejemplo de extracción solamente algunos archivos, consulte:
How to get Inno Setup to unzip a single file?

Cuestiones relacionadas