Kør batch-fil i Windows Installer Commit

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har ingen succes med at ændre en Windows Installer MSI til at køre en batchfil, efter at den primære output er blevet installeret. Jeg har søgt efter dette og fundet mange forslag, men intet der virker.



Tilføj en tilpasset handling

Brugerdefinerede handlinger kan kun være eksekverbare filer. En batchfil er ikke eksekverbar.



Opret en Windows Scripting Host eksekverbar, der kører batchfilen

Mange mennesker har forsøgt at gøre dette, herunder på SO, og ingen har kunnet få det til at fungere.



Brug WIX eller InstallShield

Jeg har ikke tid eller autoritet til at ændre firmainstallatorteknologi.



Rediger .msi med Orca og tilføj en tilpasset egenskab, derefter en tilpasset handling, og rediger derefter InstallExecuteSequence, ...

Jeg har prøvet dette i flere timer og har kun lavet installatører, der kaster en systemfejl, når jeg kører dem.


Bedste reference


Hvad du sagde ovenfor er forkert:



  Tilpassede handlinger kan kun udføres
  filer. En batchfil er ikke eksekverbar.



Tilpassede handlinger (selv uden værktøjer som InstallShield) kan være .EXE, VBScript, JScript eller DLL-baseret. Hvis du skriver en DLL, kan du skrive uanset kode, du vil kalde en batchfil eller foretage ændringer, du vil have til systemet - der er ingen grænse.


Opdater : Et eksempel, der fungerede for mig: (indtastning i CustomAction-tabellen)


Action Test
Type 34
Source SystemFolder
Target cmd.exe /c c:	est.bat
ExtendedType <blank>

Andre referencer 1


Jeg kunne løse dette ved at oprette en EXE bestående hovedsageligt af:


System.Diagnostics.Process.Start(pathToBatchFile);


Tilføjelse af EXE til MSI-filen, så kører den som en brugerdefineret handling.

Andre referencer 2


Mens svaret 'William Leara' er en meget god start, fandt jeg en bedre løsning her værd at nævne. [5]


En anden fordel, som denne metode har, er at du kan sætte din batchfil i applikationsinstallationsmappen i stedet for root C-mappen, men vi bruger specielle flag til at udsætte udførelsen til efter FileCopy -handling. Vi bruger også noImpersonate at have højere privilegium, der er nødvendigt for at køre fra Programfiler


Et par noter:



  1. Brug TARGETDIR i stedet for INSTALLDIR

  2. Sørg for at citere stierne.



Dette er mine to brugerdefinerede handlinger. I mit tilfælde vil jeg tvinge native kommandoprocessor til at lave nogle få registreringsposter, så jeg bruger ikke COMSPEC .


Første handling (type 50) udfører kommando i Source med input argumenter for Target, fordi Type er 50 + 1024 + 2048, da det er udsat handling med noImpersonate flag.



  • Handling: FinalAction

  • Type: 3122

  • Kilde: NCOM

  • Mål: /c '[[TARGETDIR]] Fixup.bat'



Anden handling definerer NCOM ejendom med det samme:



  • Handling: FinalNativeSys

  • Type: 51

  • Kilde: NCOM

  • Mål: [[WindowsFolder]] System32 \ cmd.exe



Derefter skal du føje disse handlinger til InstallExecuteSequence :



  • Handling: FinalAction

  • Tilstand: IKKE installeret

  • Sekvens: 5002



Og denne ene:



  • Handling: FinalNativeSys

  • Tilstand:

  • Sekvens: 5001



Bemærk, at jeg i mit tilfælde nemt kunne justere handlingerne for at kalde reg.exe-importen Fixup.reg også.
Endelig kan man bruge msitran som foreslået her i en postbygning for at automatisere proceduren.

Andre referencer 3


Lav en EXE, der gør en midlertidig .bat-fil til at skifte til den ønskede mappe og CALL en anden flagermusfil, der gør hvad du har brug for.


Fortæl den tilpassede handling for at bruge den exe.


Det første argument til en CPP exe er vejen til exe selv. Dette kan bruges til at orientere dig selv, og disse oplysninger kan bruges til fremstilling af det midlertidige .bat

Andre referencer 4


I mit tilfælde tilføjede jeg 'Custom Actions'.
I mappen 'Installer' vælges 'Tilføj tilpasset handling'
Vælg cmd.exe (c: \ windows \ system32 \ cmd.exe)
Derefter i egenskaber af cmd.exe skal du redigere 'Argumenter' til
'/Installer/c C: \ myApp.exe --exec-some-action'