NSIS Script Parser (made with NSIS): Difference between revisions
No edit summary |
m (better formatting) |
||
(One intermediate revision by one other user not shown) | |||
Line 11: | Line 11: | ||
<highlight-nsis> | <highlight-nsis> | ||
######################################## | |||
Name "NSISScript" | Name "NSISScript" | ||
Line 17: | Line 17: | ||
XPStyle on | XPStyle on | ||
######################################## | |||
Var Var0 | Var Var0 | ||
Line 39: | Line 39: | ||
!define Var8 $Var8 | !define Var8 $Var8 | ||
######################################## | |||
!include _Func.nsh | !include _Func.nsh | ||
!include _Parser.nsh | !include _Parser.nsh | ||
######################################## | |||
Function .onInit | Function .onInit | ||
Line 79: | Line 79: | ||
FunctionEnd | FunctionEnd | ||
######################################## | |||
Section | Section | ||
SectionEnd | SectionEnd | ||
######################################## | |||
</highlight-nsis> | </highlight-nsis> | ||
Line 91: | Line 91: | ||
<highlight-nsis> | <highlight-nsis> | ||
######################################## | |||
!macro ExpandNSISVars Var | !macro ExpandNSISVars Var | ||
Line 140: | Line 140: | ||
FunctionEnd | FunctionEnd | ||
######################################## | |||
!macro SetNSISVar Var With | !macro SetNSISVar Var With | ||
Line 191: | Line 191: | ||
FunctionEnd | FunctionEnd | ||
######################################## | |||
Function StrReplaceV4 | Function StrReplaceV4 | ||
Line 239: | Line 239: | ||
FunctionEnd | FunctionEnd | ||
######################################## | |||
Function GetParameters | Function GetParameters | ||
Line 278: | Line 278: | ||
FunctionEnd | FunctionEnd | ||
######################################## | |||
Function TrimNSISJunk | Function TrimNSISJunk | ||
Line 292: | Line 292: | ||
IntOp ${Var2} ${Var2} + 1 | IntOp ${Var2} ${Var2} + 1 | ||
StrCpy ${Var3} ${Var0} 1 ${Var2} | StrCpy ${Var3} ${Var0} 1 ${Var2} | ||
IntCmp ${Var2} ${Var1} | IntCmp ${Var2} ${Var1} DoneA 0 DoneA | ||
StrCmp ${Var3} `#` +2 | StrCmp ${Var3} `#` +2 | ||
Line 373: | Line 373: | ||
FunctionEnd | FunctionEnd | ||
######################################## | |||
Function ReadNSISInstruction | Function ReadNSISInstruction | ||
Line 423: | Line 423: | ||
FunctionEnd | FunctionEnd | ||
######################################## | |||
</highlight-nsis> | </highlight-nsis> | ||
Line 430: | Line 430: | ||
<highlight-nsis> | <highlight-nsis> | ||
######################################## | |||
!macro _ReadRegStr RootKey1 RootKey2 | !macro _ReadRegStr RootKey1 RootKey2 | ||
Line 470: | Line 470: | ||
!macroend | !macroend | ||
######################################## | |||
!macro _WriteRegStr RootKey1 RootKey2 | !macro _WriteRegStr RootKey1 RootKey2 | ||
Line 509: | Line 509: | ||
!macroend | !macroend | ||
######################################## | |||
!macro _DeleteRegKeyEmpty RootKey1 RootKey2 | !macro _DeleteRegKeyEmpty RootKey1 RootKey2 | ||
Line 565: | Line 565: | ||
!macroend | !macroend | ||
######################################## | |||
!macro _DeleteRegValue RootKey1 RootKey2 | !macro _DeleteRegValue RootKey1 RootKey2 | ||
Line 602: | Line 602: | ||
!macroend | !macroend | ||
######################################## | |||
!macro AlertBox | !macro AlertBox | ||
Line 616: | Line 616: | ||
!macroend | !macroend | ||
######################################## | |||
!macro InfoBox | !macro InfoBox | ||
Line 630: | Line 630: | ||
!macroend | !macroend | ||
######################################## | |||
Function ExecuteNSISInstruction | Function ExecuteNSISInstruction | ||
Line 664: | Line 664: | ||
FunctionEnd | FunctionEnd | ||
######################################## | |||
</highlight-nsis> | </highlight-nsis> |
Latest revision as of 10:18, 14 April 2006
Author: Afrow UK (talk, contrib) |
Description
For one of my NSIS projects to download and install products from the Internet, I needed some kind of scripting capabilities to perform certain custom tasks on the machine. Some download Zip files contained Dynamic Link Library's that needed to be registered and some registry keys needed to be written.
I decided that NSIS instructions would be ideal for performing these tasks (e.g. RegDll, WriteRegStr etc) and so I began working on a NSIS Script Parser, which is written in NSIS itself. I didn't realise how much work it involved and in the end I decided it would be much better (and more flexible) to write a wrapper for makensis.exe. I stopped working on the NSIS Script Parser, but for future reference I decided to put up what I had started on here. It works, but you're only limited to about 4 NSIS instructions and two of my own which are 'cut down' versions of MessageBox.
NSISScript.nsi
######################################## Name "NSISScript" OutFile "NSISScript.exe" XPStyle on ######################################## Var Var0 Var Var1 Var Var2 Var Var3 Var Var4 Var Var5 Var Var6 Var Var7 Var Var8 !define Var0 $Var0 !define Var1 $Var1 !define Var2 $Var2 !define Var3 $Var3 !define Var4 $Var4 !define Var5 $Var5 !define Var6 $Var6 !define Var7 $Var7 !define Var8 $Var8 ######################################## !include _Func.nsh !include _Parser.nsh ######################################## Function .onInit Call GetParameters Pop ${Var5} StrCmp ${Var5} "" Abort IfFileExists ${Var5} +3 IfFileExists $EXEDIR\${Var5} 0 Abort StrCpy ${Var5} $EXEDIR\${Var5} SetOutPath $EXEDIR FileOpen ${Var6} ${Var5} r Loop: ClearErrors FileRead ${Var6} ${Var1} IfErrors Done Push ${Var1} Call TrimNSISJunk Pop ${Var1} Push ${Var1} Call ReadNSISInstruction Call ExecuteNSISInstruction Goto Loop Done: FileClose ${Var6} Abort: Abort FunctionEnd ######################################## Section SectionEnd ########################################
_Func.nsh
######################################## !macro ExpandNSISVars Var Push `${Var}` Call ExpandNSISVars Pop `${Var}` !macroend !define ExpandNSISVars `!insertmacro ExpandNSISVars` Function ExpandNSISVars Exch ${Var0} !macro _ExpandNSISVars VarName Var Push ${Var1} Push ${Var2} Push `${VarName}` Push `${Var}` Push ${Var0} Call StrReplaceV4 Pop ${Var0} Pop ${Var2} Pop ${Var1} !macroend !insertmacro _ExpandNSISVars $$0 $0 !insertmacro _ExpandNSISVars $$1 $1 !insertmacro _ExpandNSISVars $$2 $2 !insertmacro _ExpandNSISVars $$3 $3 !insertmacro _ExpandNSISVars $$4 $4 !insertmacro _ExpandNSISVars $$5 $5 !insertmacro _ExpandNSISVars $$6 $6 !insertmacro _ExpandNSISVars $$7 $7 !insertmacro _ExpandNSISVars $$8 $8 !insertmacro _ExpandNSISVars $$9 $9 !insertmacro _ExpandNSISVars $$R0 $R0 !insertmacro _ExpandNSISVars $$R1 $R1 !insertmacro _ExpandNSISVars $$R2 $R2 !insertmacro _ExpandNSISVars $$R3 $R3 !insertmacro _ExpandNSISVars $$R4 $R4 !insertmacro _ExpandNSISVars $$R5 $R5 !insertmacro _ExpandNSISVars $$R6 $R6 !insertmacro _ExpandNSISVars $$R7 $R7 !insertmacro _ExpandNSISVars $$R8 $R8 !insertmacro _ExpandNSISVars $$R9 $R9 Exch ${Var0} FunctionEnd ######################################## !macro SetNSISVar Var With Push ${Var0} Push ${Var1} Push `${Var}` Push `${With}` Call SetNSISVar Pop ${Var1} Pop ${Var0} !macroend !define SetNSISVar `!insertmacro SetNSISVar` Function SetNSISVar Exch ${Var0} Exch Exch ${Var1} !macro _SetNSISVar Compare UseVar StrCmp ${Var1} ${Compare} 0 +3 StrCpy ${UseVar} ${Var0} Goto Done !macroend !insertmacro _SetNSISVar $$0 $0 !insertmacro _SetNSISVar $$1 $1 !insertmacro _SetNSISVar $$2 $2 !insertmacro _SetNSISVar $$3 $3 !insertmacro _SetNSISVar $$4 $4 !insertmacro _SetNSISVar $$5 $5 !insertmacro _SetNSISVar $$6 $6 !insertmacro _SetNSISVar $$7 $7 !insertmacro _SetNSISVar $$8 $8 !insertmacro _SetNSISVar $$9 $9 !insertmacro _SetNSISVar $$R0 $R0 !insertmacro _SetNSISVar $$R1 $R1 !insertmacro _SetNSISVar $$R2 $R2 !insertmacro _SetNSISVar $$R3 $R3 !insertmacro _SetNSISVar $$R4 $R4 !insertmacro _SetNSISVar $$R5 $R5 !insertmacro _SetNSISVar $$R6 $R6 !insertmacro _SetNSISVar $$R7 $R7 !insertmacro _SetNSISVar $$R8 $R8 !insertmacro _SetNSISVar $$R9 $R9 Done: Pop ${Var1} Pop ${Var0} FunctionEnd ######################################## Function StrReplaceV4 Exch ${Var0} #in Exch 1 Exch ${Var1} #with Exch 2 Exch ${Var2} #replace Push ${Var3} Push ${Var4} Push ${Var5} Push ${Var6} Push ${Var7} Push ${Var8} StrCpy ${Var3} -1 StrLen ${Var5} ${Var0} StrLen ${Var6} ${Var1} StrLen ${Var7} ${Var2} Loop: IntOp ${Var3} ${Var3} + 1 StrCpy ${Var4} ${Var0} ${Var7} ${Var3} StrCmp ${Var3} ${Var5} End StrCmp ${Var4} ${Var2} 0 Loop StrCpy ${Var4} ${Var0} ${Var3} IntOp ${Var8} ${Var3} + ${Var7} StrCpy ${Var8} ${Var0} "" ${Var8} StrCpy ${Var0} ${Var4}${Var1}${Var8} IntOp ${Var3} ${Var3} + ${Var6} IntOp ${Var3} ${Var3} - 1 IntOp ${Var5} ${Var5} - ${Var7} IntOp ${Var5} ${Var5} + ${Var6} Goto Loop End: Pop ${Var8} Pop ${Var7} Pop ${Var6} Pop ${Var5} Pop ${Var4} Pop ${Var3} Pop ${Var2} Pop ${Var1} Exch ${Var0} #out FunctionEnd ######################################## Function GetParameters Push $R0 Push $R1 Push $R2 Push $R3 StrCpy $R2 1 StrLen $R3 $CMDLINE ;Check for quote or space StrCpy $R0 $CMDLINE $R2 StrCmp $R0 '"' 0 +3 StrCpy $R1 '"' Goto loop StrCpy $R1 " " loop: IntOp $R2 $R2 + 1 StrCpy $R0 $CMDLINE 1 $R2 StrCmp $R0 $R1 get StrCmp $R2 $R3 get Goto loop get: IntOp $R2 $R2 + 1 StrCpy $R0 $CMDLINE 1 $R2 StrCmp $R0 " " get StrCpy $R0 $CMDLINE "" $R2 Pop $R3 Pop $R2 Pop $R1 Exch $R0 FunctionEnd ######################################## Function TrimNSISJunk Exch ${Var0} Push ${Var1} Push ${Var2} Push ${Var3} Push ${Var4} StrLen ${Var1} ${Var0} StrCpy ${Var2} -1 LoopA: IntOp ${Var2} ${Var2} + 1 StrCpy ${Var3} ${Var0} 1 ${Var2} IntCmp ${Var2} ${Var1} DoneA 0 DoneA StrCmp ${Var3} `#` +2 StrCmp ${Var3} `;` 0 LoopA IntOp ${Var2} ${Var2} - 1 StrCpy ${Var0} ${Var0} ${Var2} DoneA: StrCmp ${Var0} "" End StrLen ${Var1} ${Var0} StrCpy ${Var2} -1 LoopB: IntOp ${Var2} ${Var2} + 1 StrCpy ${Var3} ${Var0} 2 ${Var2} IntCmp ${Var2} ${Var1} DoneB 0 DoneB StrCmp ${Var3} `/*` 0 LoopB StrCpy ${Var4} ${Var2} DoneB: LoopC: IntOp ${Var2} ${Var2} + 1 StrCpy ${Var3} ${Var0} 2 ${Var2} IntCmp ${Var2} ${Var1} DoneC 0 DoneC StrCmp ${Var3} `*/` 0 LoopC IntOp ${Var2} ${Var2} + 2 StrCpy ${Var3} ${Var0} ${Var4} StrCpy ${Var2} ${Var0} "" ${Var2} StrCpy ${Var0} ${Var3}${Var2} StrCpy ${Var2} ${Var4} Goto LoopB DoneC: StrCmp ${Var0} "" End StrLen ${Var1} ${Var0} StrCpy ${Var2} 0 LoopD: IntOp ${Var2} ${Var2} + 1 StrCpy ${Var3} ${Var0} 1 -${Var2} IntCmp ${Var2} ${Var1} DoneD 0 DoneD StrCmp ${Var3} `$\n` LoopD StrCmp ${Var3} `$\r` LoopD StrCmp ${Var3} ` ` LoopD StrCmp ${Var3} `$\t` LoopD DoneD: IntOp ${Var2} ${Var2} - 1 StrCpy ${Var0} ${Var0} -${Var2} StrCmp ${Var0} "" End StrLen ${Var1} ${Var0} StrCpy ${Var2} -1 LoopE: IntOp ${Var2} ${Var2} + 1 StrCpy ${Var3} ${Var0} 1 ${Var2} IntCmp ${Var2} ${Var1} DoneE 0 DoneE StrCmp ${Var3} ` ` LoopE StrCmp ${Var3} `$\t` LoopE DoneE: StrCpy ${Var0} ${Var0} "" ${Var2} End: Pop ${Var4} Pop ${Var3} Pop ${Var2} Pop ${Var1} Exch ${Var0} FunctionEnd ######################################## Function ReadNSISInstruction Pop ${Var1} Push "/END" StrCmp ${Var1} $\n End StrCmp ${Var1} $\r$\n End StrLen ${Var4} ${Var1} StrCpy ${Var2} 0 LoopBefore: IntOp ${Var2} ${Var2} - 1 IntCmp ${Var2} -${Var4} End End StrCpy ${Var0} ${Var1} 1 ${Var2} StrCmp ${Var0} `"` +3 StrCmp ${Var0} `'` +2 StrCmp ${Var0} '`' 0 +5 StrCpy ${Var5} ${Var0} StrCpy ${Var3} ${Var2} IntOp ${Var3} ${Var3} - 1 Goto LoopAfter StrCmp ${Var0} ` ` LoopBefore StrCmp ${Var0} `$\t` LoopBefore StrCmp ${Var0} `$\r` LoopBefore StrCmp ${Var0} `$\n` LoopBefore StrCpy ${Var5} ` ` StrCpy ${Var3} ${Var2} LoopAfter: IntOp ${Var2} ${Var2} - 1 IntCmp ${Var2} -${Var4} 0 0 +3 IntOp ${Var2} ${Var2} - 1 Goto PushInstruction StrCpy ${Var0} ${Var1} 1 ${Var2} StrCmp ${Var0} ${Var5} PushInstruction LoopAfter PushInstruction: IntOp ${Var0} ${Var2} - ${Var3} IntOp ${Var0} ${Var0} * -1 IntOp ${Var3} ${Var2} + 1 StrCpy ${Var3} ${Var1} ${Var0} ${Var3} Push ${Var3} Goto LoopBefore End: FunctionEnd ########################################
_Parser.nsh
######################################## !macro _ReadRegStr RootKey1 RootKey2 StrCmp ${Var2} ${RootKey1} +2 StrCmp ${Var2} ${RootKey2} 0 +3 ReadRegStr ${Var0} ${RootKey1} `${Var3}` `${Var4}` Goto Label${UniqueID} !macroend !macro ReadRegStr !define UniqueID ${__LINE__} Pop ${Var1} Pop ${Var2} Pop ${Var3} ${ExpandNSISVars} ${Var3} Pop ${Var4} ${ExpandNSISVars} ${Var4} Pop ${Var0} # /END !insertmacro _ReadRegStr HKCR HKEY_CLASSES_ROOT !insertmacro _ReadRegStr HKLM HKEY_LOCAL_MACHINE !insertmacro _ReadRegStr HKCU HKEY_CURRENT_USER !insertmacro _ReadRegStr HKU HKEY_USERS !insertmacro _ReadRegStr HKCC HKEY_CURRENT_CONFIG !insertmacro _ReadRegStr HKDD HKEY_DYN_DATA !insertmacro _ReadRegStr HKPD HKEY_PERFORMANCE_DATA !insertmacro _ReadRegStr SHCTX SHELL_CONTEXT Label${UniqueID}: ${SetNSISVar} ${Var1} ${Var0} Goto Done !undef UniqueID !macroend ######################################## !macro _WriteRegStr RootKey1 RootKey2 StrCmp ${Var1} ${RootKey1} +2 StrCmp ${Var1} ${RootKey2} 0 +3 WriteRegStr ${RootKey1} `${Var2}` `${Var3}` `${Var4}` Goto Label${UniqueID} !macroend !macro WriteRegStr !define UniqueID ${__LINE__} Pop ${Var1} Pop ${Var2} ${ExpandNSISVars} ${Var2} Pop ${Var3} ${ExpandNSISVars} ${Var3} Pop ${Var4} ${ExpandNSISVars} ${Var4} Pop ${Var0} # /END !insertmacro _WriteRegStr HKCR HKEY_CLASSES_ROOT !insertmacro _WriteRegStr HKLM HKEY_LOCAL_MACHINE !insertmacro _WriteRegStr HKCU HKEY_CURRENT_USER !insertmacro _WriteRegStr HKU HKEY_USERS !insertmacro _WriteRegStr HKCC HKEY_CURRENT_CONFIG !insertmacro _WriteRegStr HKDD HKEY_DYN_DATA !insertmacro _WriteRegStr HKPD HKEY_PERFORMANCE_DATA !insertmacro _WriteRegStr SHCTX SHELL_CONTEXT Label${UniqueID}: Goto Done !undef UniqueID !macroend ######################################## !macro _DeleteRegKeyEmpty RootKey1 RootKey2 StrCmp ${Var2} ${RootKey1} +2 StrCmp ${Var2} ${RootKey2} 0 +3 DeleteRegKey `/ifempty` ${RootKey1} `${Var3}` Goto Label${UniqueID} !macroend !macro _DeleteRegKey RootKey1 RootKey2 StrCmp ${Var1} ${RootKey1} +2 StrCmp ${Var1} ${RootKey2} 0 +3 DeleteRegKey ${RootKey1} `${Var2}` Goto Label${UniqueID} !macroend !macro DeleteRegKey !define UniqueID ${__LINE__} Pop ${Var1} Pop ${Var2} StrCmp ${Var1} `/ifempty` 0 NoIfEmpty${UniqueID} Pop ${Var3} ${ExpandNSISVars} ${Var3} !insertmacro _DeleteRegKeyEmpty HKCR HKEY_CLASSES_ROOT !insertmacro _DeleteRegKeyEmpty HKLM HKEY_LOCAL_MACHINE !insertmacro _DeleteRegKeyEmpty HKCU HKEY_CURRENT_USER !insertmacro _DeleteRegKeyEmpty HKU HKEY_USERS !insertmacro _DeleteRegKeyEmpty HKCC HKEY_CURRENT_CONFIG !insertmacro _DeleteRegKeyEmpty HKDD HKEY_DYN_DATA !insertmacro _DeleteRegKeyEmpty HKPD HKEY_PERFORMANCE_DATA !insertmacro _DeleteRegKeyEmpty SHCTX SHELL_CONTEXT NoIfEmpty${UniqueID}: ${ExpandNSISVars} ${Var2} !insertmacro _DeleteRegKey HKCR HKEY_CLASSES_ROOT !insertmacro _DeleteRegKey HKLM HKEY_LOCAL_MACHINE !insertmacro _DeleteRegKey HKCU HKEY_CURRENT_USER !insertmacro _DeleteRegKey HKU HKEY_USERS !insertmacro _DeleteRegKey HKCC HKEY_CURRENT_CONFIG !insertmacro _DeleteRegKey HKDD HKEY_DYN_DATA !insertmacro _DeleteRegKey HKPD HKEY_PERFORMANCE_DATA !insertmacro _DeleteRegKey SHCTX SHELL_CONTEXT Label${UniqueID}: Pop ${Var0} # /END Goto Done !undef UniqueID !macroend ######################################## !macro _DeleteRegValue RootKey1 RootKey2 StrCmp ${Var1} ${RootKey1} +2 StrCmp ${Var1} ${RootKey2} 0 +3 DeleteRegValue ${RootKey1} `${Var2}` `${Var3}` Goto Label${UniqueID} !macroend !macro DeleteRegValue !define UniqueID ${__LINE__} Pop ${Var1} Pop ${Var2} ${ExpandNSISVars} ${Var2} Pop ${Var3} ${ExpandNSISVars} ${Var3} Pop ${Var0} # /END !insertmacro _DeleteRegValue HKCR HKEY_CLASSES_ROOT !insertmacro _DeleteRegValue HKLM HKEY_LOCAL_MACHINE !insertmacro _DeleteRegValue HKCU HKEY_CURRENT_USER !insertmacro _DeleteRegValue HKU HKEY_USERS !insertmacro _DeleteRegValue HKCC HKEY_CURRENT_CONFIG !insertmacro _DeleteRegValue HKDD HKEY_DYN_DATA !insertmacro _DeleteRegValue HKPD HKEY_PERFORMANCE_DATA !insertmacro _DeleteRegValue SHCTX SHELL_CONTEXT Label${UniqueID}: Goto Done !undef UniqueID !macroend ######################################## !macro AlertBox Pop ${Var1} ${ExpandNSISVars} ${Var1} Pop ${Var0} # /END MessageBox MB_OK|MB_ICONEXCLAMATION ${Var1} Goto Done !macroend ######################################## !macro InfoBox Pop ${Var1} ${ExpandNSISVars} ${Var1} Pop ${Var0} # /END MessageBox MB_OK|MB_ICONINFORMATION ${Var1} Goto Done !macroend ######################################## Function ExecuteNSISInstruction Pop ${Var0} StrCmp ${Var0} ReadRegStr 0 NotReadRegStr !insertmacro ReadRegStr NotReadRegStr: StrCmp ${Var0} WriteRegStr 0 NotWriteRegStr !insertmacro WriteRegStr NotWriteRegStr: StrCmp ${Var0} DeleteRegKey 0 NotDeleteRegKey !insertmacro DeleteRegKey NotDeleteRegKey: StrCmp ${Var0} DeleteRegValue 0 NotDeleteRegValue !insertmacro DeleteRegValue NotDeleteRegValue: StrCmp ${Var0} AlertBox 0 NotAlertBox !insertmacro AlertBox NotAlertBox: StrCmp ${Var0} InfoBox 0 NotInfoBox !insertmacro InfoBox NotInfoBox: Done: FunctionEnd ########################################
Example.txt
ReadRegStr $R0 HKCU "Software\ZipCentral" "Extract1" AlertBox $R0 InfoBox $R0
How to run
Save all the above files and then compile NSISScript.nsi. Change the above registry path to one that you know exists. Create a shortcut to NSISScript.exe and give it Example.txt as a parameter. Double click on the shortcut to run the script code.
-Stu