Difference between revisions of "Firefox ext install downloads"
m (→Firefox 3.6+ and Extension Installation Files) |
(Upgrade to recent FF release :-)) |
||
Line 1: | Line 1: | ||
+ | == Firefox 10+ and Extension Installation Files == | ||
+ | Since FF 4, it is no longer required, even recommanded, to unzip xpi files. Thus the former cmd batch must be slightly adapted to provide full support of global extension installation. At the time, this part is written, it lacks the uninstall file test. So, to keep a sort of wpkg control, a simple hack is included (see inline explanations below). | ||
+ | |||
+ | ===packages/mozilla/install-extensions.cmd=== | ||
+ | <source lang="dos"> | ||
+ | :: Mozilla extension installation demo script for Firefox and Thunderbird versions | ||
+ | :: based on Gecko 1.9+ from which the -install-global-extension command line option | ||
+ | :: has been removed. This script must be run from a Windows account with local | ||
+ | :: administrative rights. The extensions it installs can be run immediately by | ||
+ | :: limited users. | ||
+ | :: | ||
+ | :: Stephen Thomas <flabdablet (at) gmail.com> 31-Jan-2010 | ||
+ | :: | ||
+ | :: This is free software. Do whatever you want with it except hold me accountable | ||
+ | :: for the grief it will undoubtedly cause you. If you improve it, I'd like to hear | ||
+ | :: from you. | ||
+ | |||
+ | set mozextn=call :mozextn | ||
+ | set return=goto :eof | ||
+ | set rmdir=rmdir /s /q | ||
+ | set copy=copy /Y | ||
+ | |||
+ | :: set xpidir=C:\NETINST | ||
+ | set xpidir=%SOFTWARE%\mozilla\fx_extensions | ||
+ | set zip=%ProgramFiles%\7-Zip\7z.exe | ||
+ | :: set zip="%SOFTWARE%\packages\mozilla\7-Zip\7z.exe" | ||
+ | |||
+ | :: :: give args on command line | ||
+ | :: Firefox myextension | ||
+ | :: Thunderbird myextension | ||
+ | :: (myextension without .xpi) | ||
+ | %mozextn% %1 %2 | ||
+ | %return% | ||
+ | |||
+ | |||
+ | |||
+ | :: Install a Mozilla extension XPI package into a system-wide folder, and add | ||
+ | :: the registry key required to tell the Mozilla app it's there. | ||
+ | :: | ||
+ | :: Uses the same root folder for all packages regardless of whether they are | ||
+ | :: intended for Firefox or Thunderbird; this allows both apps to share disk space | ||
+ | :: for any extensions they have in common. | ||
+ | :: | ||
+ | :: If there's already a folder in "%ProgramFiles%\Mozilla %appname%\extensions" | ||
+ | :: named for the ID of the extension being installed, or if the registry key | ||
+ | :: already exists and points to a different folder from the new one, the old | ||
+ | :: folders are deleted before the registry key is updated. | ||
+ | :: | ||
+ | :: Parameters: | ||
+ | :: | ||
+ | :: %1: app name (Firefox or Thunderbird) | ||
+ | :: %2: XPI package name, without trailing .xpi; also used to name the | ||
+ | :: installation folder. | ||
+ | :: | ||
+ | :: Returns errorlevel 0 if installation worked, 1 if not. | ||
+ | :: | ||
+ | :: Uses a totally unsound hack to extract the package ID from its install.rdf | ||
+ | :: file; will break horribly if the first <em:id> XML tag encountered does not | ||
+ | :: belong to the package ID, or if <em:id>package-id</em:id> is not all on | ||
+ | :: one line. If you'd rather use a proper XML parser instead, be my guest. If | ||
+ | :: it's really easy to do, let me know. | ||
+ | |||
+ | :mozextn | ||
+ | set extnroot=%CommonProgramFiles%\Mozilla Shared\Extensions | ||
+ | set extntemp=%temp%\ | ||
+ | |||
+ | if not exist "%extnroot%" mkdir "%extnroot%" | ||
+ | if errorlevel 1 %return% | ||
+ | |||
+ | ::set extndir=%extnroot%\%2 | ||
+ | set extndir=%extntemp%\%2 | ||
+ | if exist "%extndir%" %rmdir% "%extndir%" | ||
+ | "%zip%" x -yo"%extndir%" "%xpidir%\%2.xpi" | ||
+ | if errorlevel 1 %return% | ||
+ | |||
+ | for /f "skip=2 tokens=*" %%L in ('find "<em:id>" "%extndir%\install.rdf"') do @( | ||
+ | set line="%%L" | ||
+ | goto :mozextn1 | ||
+ | ) | ||
+ | |||
+ | :mozextn1 | ||
+ | set id=%line:~8,-9% | ||
+ | if "%id%"=="" ( | ||
+ | %rmdir% "%extndir%" | ||
+ | verify error 2>nul | ||
+ | %return% | ||
+ | ) | ||
+ | |||
+ | set olddir=%ProgramFiles%\Mozilla %1\extensions\%id% | ||
+ | if exist "%olddir%" %rmdir% "%olddir%" | ||
+ | |||
+ | if exist "%extndir%" %rmdir% "%extndir%" | ||
+ | |||
+ | |||
+ | set key=HKLM\Software\Mozilla\%1\Extensions | ||
+ | for /f "skip=4 tokens=2*" %%A in ('reg query "%key%" /v "%id%"') do set olddir=%%B | ||
+ | if not "%olddir%"=="%extndir%" if exist "%olddir%" %rmdir% "%olddir%" | ||
+ | reg add "%key%" /v "%id%" /d "%extnroot%\%id%.xpi" /f | ||
+ | |||
+ | :: Now we mustn't unzip xpi files to install them, only copy them to the id.xpi filenames :) | ||
+ | %copy% "%xpidir%\%2.xpi" "%extnroot%\%id%.xpi" | ||
+ | |||
+ | :: quick and dirty hack : we create an empty text file, which name will be used in the | ||
+ | :: wpkg xml file to check the success of the installation | ||
+ | |||
+ | @echo "%2" >"%extnroot%\%2.txt" | ||
+ | |||
+ | %return% | ||
+ | </source> | ||
+ | |||
+ | ===packages/mozilla/remove-extensions.cmd=== | ||
+ | To be provided | ||
+ | |||
+ | |||
+ | ===templates/ff-extension.xml=== | ||
+ | <source lang="xml"> | ||
+ | |||
+ | <package | ||
+ | id='firefox-ext-&ext-name;' | ||
+ | name='Firefox Extension &ext-name;' | ||
+ | revision='&ext-key;' | ||
+ | priority='15'> | ||
+ | |||
+ | <variable name='FXEXT' value='&ext-name;-&ext-key;'/> | ||
+ | <variable name='fxname' value='&ext-name;-'/> | ||
+ | |||
+ | <!-- the old fashion check won't do the job anymore with xpi not unzipped unless we do some quick&dirty "hack" --> | ||
+ | <check type="logical" condition="or"> | ||
+ | <check type="file" condition="exists" path="%CommonProgramFiles%\Mozilla Shared\Extensions\%FXEXT%.txt" /> | ||
+ | <check type="file" condition="exists" path="%CommonProgramFiles(x86)%\Mozilla Shared\Extensions\%FXEXT%.txt" /> | ||
+ | </check> | ||
+ | |||
+ | <depends package-id="firefox-check" /> | ||
+ | |||
+ | <install cmd='"%SOFTWARE%\mozilla\install-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-install.log'/> | ||
+ | <upgrade cmd='"%SOFTWARE%\mozilla\remove-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-upgrade-remove.log'/> | ||
+ | <upgrade cmd='"%SOFTWARE%\mozilla\install-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-upgrade.log'/> | ||
+ | |||
+ | <downgrade cmd='"%SOFTWARE%\mozilla\install-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-downgrade.log'/> | ||
+ | <remove cmd='"%SOFTWARE%\mozilla\remove-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-remove.log'/> | ||
+ | <remove cmd='cmd /c if exist "%CommonProgramFiles%\Mozilla Shared\Extensions\%FXEXT%\" rmdir /s /q "%CommonProgramFiles%\Mozilla Shared\Extensions\%FXEXT%\"' /> | ||
+ | <remove cmd='cmd /c if exist "%CommonProgramFiles(x86)%\Mozilla Shared\Extensions\%FXEXT%\" rmdir /s /q "%CommonProgramFiles(x86)%\Mozilla Shared\Extensions\%FXEXT%\"' /> | ||
+ | </package> | ||
+ | </source> | ||
+ | |||
+ | |||
== Firefox 3.6+ and Extension Installation Files == | == Firefox 3.6+ and Extension Installation Files == | ||
Revision as of 20:57, 30 August 2012
Contents
Firefox 10+ and Extension Installation Files
Since FF 4, it is no longer required, even recommanded, to unzip xpi files. Thus the former cmd batch must be slightly adapted to provide full support of global extension installation. At the time, this part is written, it lacks the uninstall file test. So, to keep a sort of wpkg control, a simple hack is included (see inline explanations below).
packages/mozilla/install-extensions.cmd
:: Mozilla extension installation demo script for Firefox and Thunderbird versions
:: based on Gecko 1.9+ from which the -install-global-extension command line option
:: has been removed. This script must be run from a Windows account with local
:: administrative rights. The extensions it installs can be run immediately by
:: limited users.
::
:: Stephen Thomas <flabdablet (at) gmail.com> 31-Jan-2010
::
:: This is free software. Do whatever you want with it except hold me accountable
:: for the grief it will undoubtedly cause you. If you improve it, I'd like to hear
:: from you.
set mozextn=call :mozextn
set return=goto :eof
set rmdir=rmdir /s /q
set copy=copy /Y
:: set xpidir=C:\NETINST
set xpidir=%SOFTWARE%\mozilla\fx_extensions
set zip=%ProgramFiles%\7-Zip\7z.exe
:: set zip="%SOFTWARE%\packages\mozilla\7-Zip\7z.exe"
:: :: give args on command line
:: Firefox myextension
:: Thunderbird myextension
:: (myextension without .xpi)
%mozextn% %1 %2
%return%
:: Install a Mozilla extension XPI package into a system-wide folder, and add
:: the registry key required to tell the Mozilla app it's there.
::
:: Uses the same root folder for all packages regardless of whether they are
:: intended for Firefox or Thunderbird; this allows both apps to share disk space
:: for any extensions they have in common.
::
:: If there's already a folder in "%ProgramFiles%\Mozilla %appname%\extensions"
:: named for the ID of the extension being installed, or if the registry key
:: already exists and points to a different folder from the new one, the old
:: folders are deleted before the registry key is updated.
::
:: Parameters:
::
:: %1: app name (Firefox or Thunderbird)
:: %2: XPI package name, without trailing .xpi; also used to name the
:: installation folder.
::
:: Returns errorlevel 0 if installation worked, 1 if not.
::
:: Uses a totally unsound hack to extract the package ID from its install.rdf
:: file; will break horribly if the first <em:id> XML tag encountered does not
:: belong to the package ID, or if <em:id>package-id</em:id> is not all on
:: one line. If you'd rather use a proper XML parser instead, be my guest. If
:: it's really easy to do, let me know.
:mozextn
set extnroot=%CommonProgramFiles%\Mozilla Shared\Extensions
set extntemp=%temp%\
if not exist "%extnroot%" mkdir "%extnroot%"
if errorlevel 1 %return%
::set extndir=%extnroot%\%2
set extndir=%extntemp%\%2
if exist "%extndir%" %rmdir% "%extndir%"
"%zip%" x -yo"%extndir%" "%xpidir%\%2.xpi"
if errorlevel 1 %return%
for /f "skip=2 tokens=*" %%L in ('find "<em:id>" "%extndir%\install.rdf"') do @(
set line="%%L"
goto :mozextn1
)
:mozextn1
set id=%line:~8,-9%
if "%id%"=="" (
%rmdir% "%extndir%"
verify error 2>nul
%return%
)
set olddir=%ProgramFiles%\Mozilla %1\extensions\%id%
if exist "%olddir%" %rmdir% "%olddir%"
if exist "%extndir%" %rmdir% "%extndir%"
set key=HKLM\Software\Mozilla\%1\Extensions
for /f "skip=4 tokens=2*" %%A in ('reg query "%key%" /v "%id%"') do set olddir=%%B
if not "%olddir%"=="%extndir%" if exist "%olddir%" %rmdir% "%olddir%"
reg add "%key%" /v "%id%" /d "%extnroot%\%id%.xpi" /f
:: Now we mustn't unzip xpi files to install them, only copy them to the id.xpi filenames :)
%copy% "%xpidir%\%2.xpi" "%extnroot%\%id%.xpi"
:: quick and dirty hack : we create an empty text file, which name will be used in the
:: wpkg xml file to check the success of the installation
@echo "%2" >"%extnroot%\%2.txt"
%return%
packages/mozilla/remove-extensions.cmd
To be provided
templates/ff-extension.xml
<package
id='firefox-ext-&ext-name;'
name='Firefox Extension &ext-name;'
revision='&ext-key;'
priority='15'>
<variable name='FXEXT' value='&ext-name;-&ext-key;'/>
<variable name='fxname' value='&ext-name;-'/>
<!-- the old fashion check won't do the job anymore with xpi not unzipped unless we do some quick&dirty "hack" -->
<check type="logical" condition="or">
<check type="file" condition="exists" path="%CommonProgramFiles%\Mozilla Shared\Extensions\%FXEXT%.txt" />
<check type="file" condition="exists" path="%CommonProgramFiles(x86)%\Mozilla Shared\Extensions\%FXEXT%.txt" />
</check>
<depends package-id="firefox-check" />
<install cmd='"%SOFTWARE%\mozilla\install-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-install.log'/>
<upgrade cmd='"%SOFTWARE%\mozilla\remove-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-upgrade-remove.log'/>
<upgrade cmd='"%SOFTWARE%\mozilla\install-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-upgrade.log'/>
<downgrade cmd='"%SOFTWARE%\mozilla\install-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-downgrade.log'/>
<remove cmd='"%SOFTWARE%\mozilla\remove-extensions.cmd" Firefox %FXEXT% >%TEMP%\%FXEXT%-remove.log'/>
<remove cmd='cmd /c if exist "%CommonProgramFiles%\Mozilla Shared\Extensions\%FXEXT%\" rmdir /s /q "%CommonProgramFiles%\Mozilla Shared\Extensions\%FXEXT%\"' />
<remove cmd='cmd /c if exist "%CommonProgramFiles(x86)%\Mozilla Shared\Extensions\%FXEXT%\" rmdir /s /q "%CommonProgramFiles(x86)%\Mozilla Shared\Extensions\%FXEXT%\"' />
</package>
Firefox 3.6+ and Extension Installation Files
Here are the command and xml files listed for use by Firefox#Firefox_3.6_Series_Extension_Templates. The idea comes from [[1] Mozilla Forum Discussion] and the files are adapted from [[2] install_extensions.cmd]. New: clean-extensions.cmd is needed for removing older versions of the same extension, too.
Be sure to
* put 7zip into packages\mozilla\7-Zip\ * adjust the local path (here: C:\NETINST) if needed * have the right directory tree
My structure for mozilla installations:
packages
packages/mozilla/
packages/mozilla/fx_extensions
packages/mozilla/fx_profile
packages/mozilla/tb_extensions
packages/mozilla/7-zip
packages/mozilla/install-extensions.cmd
:: Mozilla extension installation demo script for Firefox and Thunderbird versions
:: based on Gecko 1.9+ from which the -install-global-extension command line option
:: has been removed. This script must be run from a Windows account with local
:: administrative rights. The extensions it installs can be run immediately by
:: limited users.
::
:: Stephen Thomas <flabdablet (at) gmail.com> 31-Jan-2010
::
:: This is free software. Do whatever you want with it except hold me accountable
:: for the grief it will undoubtedly cause you. If you improve it, I'd like to hear
:: from you.
set mozextn=call :mozextn
set return=goto :eof
set rmdir=rmdir /s /q
:: set xpidir=C:\NETINST
set xpidir=%SOFTWARE%\packages\mozilla\fx_extensions
:: set zip="%ProgramFiles%\7-Zip\7z.exe"
set zip="%SOFTWARE%\packages\mozilla\7-Zip\7z.exe"
:: :: give args on command line
:: Firefox myextension
:: Thunderbird myextension
:: (myextension without .xpi)
%mozextn% %1 %2
%return%
:: Install a Mozilla extension XPI package into a system-wide folder, and add
:: the registry key required to tell the Mozilla app it's there.
::
:: Uses the same root folder for all packages regardless of whether they are
:: intended for Firefox or Thunderbird; this allows both apps to share disk space
:: for any extensions they have in common.
::
:: If there's already a folder in "%ProgramFiles%\Mozilla %appname%\extensions"
:: named for the ID of the extension being installed, or if the registry key
:: already exists and points to a different folder from the new one, the old
:: folders are deleted before the registry key is updated.
::
:: Parameters:
::
:: %1: app name (Firefox or Thunderbird)
:: %2: XPI package name, without trailing .xpi; also used to name the
:: installation folder.
::
:: Returns errorlevel 0 if installation worked, 1 if not.
::
:: Uses a totally unsound hack to extract the package ID from its install.rdf
:: file; will break horribly if the first <em:id> XML tag encountered does not
:: belong to the package ID, or if <em:id>package-id</em:id> is not all on
:: one line. If you'd rather use a proper XML parser instead, be my guest. If
:: it's really easy to do, let me know.
:mozextn
if exist "%ProgramFiles%\Mozilla Firefox\firefox.exe" goto :nurXP
if not exist "%ProgramFiles(x86)%\Mozilla Firefox\firefox.exe" %return%
:nur32
set extnroot=%CommonProgramFiles(x86)%\Mozilla Shared\Extensions
if not exist "%extnroot%" mkdir "%extnroot%"
if errorlevel 1 %return%
set key=HKLM\Software\Wow6432Node\Mozilla\%1\Extensions
goto nextall
:nurXP
set extnroot=%CommonProgramFiles%\Mozilla Shared\Extensions
if not exist "%extnroot%" mkdir "%extnroot%"
if errorlevel 1 %return%
set key=HKLM\Software\Mozilla\%1\Extensions
:nextall
set extndir=%extnroot%\%2
if exist "%extndir%" %rmdir% "%extndir%"
%zip% x -yo"%extndir%" "%xpidir%\%2.xpi"
if errorlevel 1 %return%
for /f "skip=2 tokens=*" %%L in ('find "<em:id>" "%extndir%\install.rdf"') do @(
set line="%%L"
goto :mozextn1
)
:mozextn1
set id=%line:~8,-9%
if "%id%"=="" (
%rmdir% "%extndir%"
verify error 2>nul
%return%
)
set olddir=%ProgramFiles%\Mozilla %1\extensions\%id%
if exist "%olddir%" %rmdir% "%olddir%"
for /f "skip=4 tokens=2*" %%A in ('reg query "%key%" /v "%id%"') do set olddir=%%B
if not "%olddir%"=="%extndir%" if exist "%olddir%" %rmdir% "%olddir%"
reg add "%key%" /v "%id%" /d "%extndir%" /f
%return%
packages/mozilla/remove-extensions.cmd
:: Mozilla extension installation demo script for Firefox and Thunderbird versions
:: based on Gecko 1.9+ from which the -install-global-extension command line option
:: has been removed. This script must be run from a Windows account with local
:: administrative rights. The extensions it installs can be run immediately by
:: limited users.
::
:: Falko Trojahn <falko (at) trojahn (dot) de> 01-May-2010
:: adapted from
:: Stephen Thomas <flabdablet (at) gmail.com> 31-Jan-2010
::
:: This is free software. Do whatever you want with it except hold me accountable
:: for the grief it will undoubtedly cause you. If you improve it, I'd like to hear
:: from you.
set mozextn=call :mozextn
set return=goto :eof
set rmdir=rmdir /s /q
set xpidir=c:\netinst
set zip="%ProgramFiles%\7-Zip\7z.exe"
:: :: give args on command line
:: Firefox myextension
:: Thunderbird myextension
:: (myextension without .xpi)
%mozextn% %1 %2
%return%
:: REMOVE a Mozilla extension XPI package from a system-wide folder, and delete
:: the registry key required to tell the Mozilla app it's there.
::
:: Uses the same root folder for all packages regardless of whether they are
:: intended for Firefox or Thunderbird; this allows both apps to share disk space
:: for any extensions they have in common.
::
:: If there's already a folder in "%ProgramFiles%\Mozilla %appname%\extensions"
:: named for the ID of the extension being installed, or if the registry key
:: already exists and points to a different folder from the new one, the old
:: folders are deleted before the registry key is updated.
::
:: Parameters:
::
:: %1: app name (Firefox or Thunderbird)
:: %2: XPI package name, without trailing .xpi; also used to name the
:: installation folder.
::
:: Returns errorlevel 0 if installation worked, 1 if not.
::
:: Uses a totally unsound hack to extract the package ID from its install.rdf
:: file; will break horribly if the first <em:id> XML tag encountered does not
:: belong to the package ID, or if <em:id>package-id</em:id> is not all on
:: one line. If you'd rather use a proper XML parser instead, be my guest. If
:: it's really easy to do, let me know.
:mozextn
if exist "%ProgramFiles%\Mozilla Firefox\firefox.exe" goto :nurXP
if not exist "%ProgramFiles(x86)%\Mozilla Firefox\firefox.exe" %return%
:nur32
set extnroot=%CommonProgramFiles(x86)%\Mozilla Shared\Extensions
if not exist "%extnroot%" mkdir "%extnroot%"
if errorlevel 1 %return%
set key=HKLM\Software\Wow6432Node\Mozilla\%1\Extensions
goto nextall
:nurXP
set extnroot=%CommonProgramFiles%\Mozilla Shared\Extensions
if not exist "%extnroot%" mkdir "%extnroot%"
if errorlevel 1 %return%
set key=HKLM\Software\Mozilla\%1\Extensions
:nextall
set extndir=%extnroot%\%2
for /f "skip=2 tokens=*" %%L in ('find "<em:id>" "%extndir%\install.rdf"') do @(
set line="%%L"
goto :mozextn1
)
:mozextn1
set id=%line:~8,-9%
if "%id%"=="" (
verify error 2>nul
%return%
)
for /f "skip=4 tokens=2*" %%A in ('reg query "%key%" /v "%id%"') do set olddir=%%B
if "%olddir%"=="%extndir%" if exist "%olddir%" %rmdir% "%olddir%"
reg delete "%key%" /v "%id%" /f
%return%
packages/mozilla/clean-extensions.cmd
:: Mozilla extension installation demo script for Firefox and Thunderbird versions
:: based on Gecko 1.9+ from which the -install-global-extension command line option
:: has been removed. This script must be run from a Windows account with local
:: administrative rights. The extensions it installs can be run immediately by
:: limited users.
::
:: Falko Trojahn <falko (at) trojahn (dot) de> 01-May-2010
:: adapted from
:: Stephen Thomas <flabdablet (at) gmail.com> 31-Jan-2010
::
:: This is free software. Do whatever you want with it except hold me accountable
:: for the grief it will undoubtedly cause you. If you improve it, I'd like to hear
:: from you.
set mozextn=call :mozextn
set return=goto :eof
set rmdir=rmdir /s /q
set xpidir=c:\netinst
set zip="%ProgramFiles%\7-Zip\7z.exe"
:: :: give args on command line
:: Firefox myextension myextname
:: Thunderbird myextension myextname
:: (myextension without .xpi)
:: (myextname without VERSION and .xpi)
%mozextn% %1 %2 %3
%return%
:: REMOVE a Mozilla extension XPI package from a system-wide folder, and delete
:: the registry key required to tell the Mozilla app it's there.
::
:: Uses the same root folder for all packages regardless of whether they are
:: intended for Firefox or Thunderbird; this allows both apps to share disk space
:: for any extensions they have in common.
::
:: If there's already a folder in "%ProgramFiles%\Mozilla %appname%\extensions"
:: named for the ID of the extension being installed, or if the registry key
:: already exists and points to a different folder from the new one, the old
:: folders are deleted before the registry key is updated.
::
:: Parameters:
::
:: %1: app name (Firefox or Thunderbird)
:: %2: XPI package name, without trailing .xpi; also used to name the
:: installation folder.
::
:: Returns errorlevel 0 if installation worked, 1 if not.
::
:: Uses a totally unsound hack to extract the package ID from its install.rdf
:: file; will break horribly if the first <em:id> XML tag encountered does not
:: belong to the package ID, or if <em:id>package-id</em:id> is not all on
:: one line. If you'd rather use a proper XML parser instead, be my guest. If
:: it's really easy to do, let me know.
:mozextn
if exist "%ProgramFiles%\Mozilla Firefox\firefox.exe" goto :nurXP
if not exist "%ProgramFiles(x86)%\Mozilla Firefox\firefox.exe" %return%
:nur32
set extnroot=%CommonProgramFiles(x86)%\Mozilla Shared\Extensions
if not exist "%extnroot%" mkdir "%extnroot%"
if errorlevel 1 %return%
set key=HKLM\Software\Wow6432Node\Mozilla\%1\Extensions
goto nextall
:nurXP
set extnroot=%CommonProgramFiles%\Mozilla Shared\Extensions
if not exist "%extnroot%" mkdir "%extnroot%"
if errorlevel 1 %return%
set key=HKLM\Software\Mozilla\%1\Extensions
:nextall
set extndir=%extnroot%\%2
for /f "skip=2 tokens=*" %%L in ('find "<em:id>" "%extndir%\install.rdf"') do @(
set line="%%L"
goto :mozextn1
)
:mozextn1
set id=%line:~8,-9%
if "%id%"=="" (
verify error 2>nul
goto : clean
)
for /f "skip=4 tokens=2*" %%A in ('reg query "%key%" /v "%id%"') do set olddir=%%B
if "%olddir%"=="%extndir%" if exist "%olddir%" %rmdir% "%olddir%"
reg delete "%key%" /v "%id%" /f
:clean
for /f "tokens=*" %%i in ('dir /ad /b "%extnroot%\%3*"') do rmdir "%extnroot%\%%i" /s /q
%return%
profiles/firefox36.xml
To have all needed things at hand, here is a profile file firefox36.xml:
<?xml version="1.0" encoding="UTF-8"?>
<profiles>
<profile id="firefox36">
<package package-id="firefox36" />
<package package-id="firefox-ext-adblock_plus" />
<package package-id="firefox-ext-bookmarkdd" />
<package package-id="firefox-ext-dict_de-de_hunspell" />
<package package-id="firefox-ext-downthemall" />
<package package-id="firefox-ext-ie_view" />
<package package-id="firefox-ext-screengrab" />
<package package-id="firefox-ext-selection_links" />
</profile>
<profile id="firefox36-dev">
<depends profile-id="firefox36" />
<package package-id="firefox-ext-aardvark" />
<package package-id="firefox-ext-firebug" />
<package package-id="firefox-ext-fireftp" />
<package package-id="firefox-ext-colorzilla" />
<package package-id="firefox-ext-quick_locale_switcher" />
<package package-id="firefox-ext-split_browser" />
<package package-id="firefox-ext-web_developer" />
</profile>
</profiles>
templates/ff-extension.xml
<package id='firefox-ext-&ext-name;' name='Firefox Extension &ext-name;' revision='&ext-key;' priority='15'>
<variable name='fxext' value='&ext-name;-&ext-key;'/>
<variable name='fxname' value='&ext-name;-'/>
<check type="logical" condition="or">
<check type="file" condition="exists" path="%CommonProgramFiles%\Mozilla Shared\Extensions\%FXEXT%\install.rdf" />
<check type="file" condition="exists" path="%CommonProgramFiles(x86)%\Mozilla Shared\Extensions\%FXEXT%\install.rdf" />
</check>
<depends package-id="firefox-check" />
<install cmd='"%SOFTWARE%\packages\mozilla\install-extensions.cmd" Firefox %FXEXT% >c:\netinst\logs\%FXEXT%-install.log'/>
<upgrade cmd='%SOFTWARE%\tools\pskill.exe firefox.exe'> <exit code="-1" /> </upgrade>
<upgrade cmd='"%SOFTWARE%\packages\mozilla\clean-extensions.cmd" Firefox %FXEXT% %FXNAME%>c:\netinst\logs\%FXNAME%-upgrade.log'/>
<upgrade cmd='"%SOFTWARE%\packages\mozilla\install-extensions.cmd" Firefox %FXEXT% >c:\netinst\logs\%FXEXT%-upgrade.log'/>
<downgrade cmd='%SOFTWARE%\tools\pskill.exe firefox.exe'> <exit code="-1" /> </downgrade>
<downgrade cmd='"%SOFTWARE%\packages\mozilla\clean-extensions.cmd" Firefox %FXEXT% %FXNAME%>c:\netinst\logs\%FXNAME%-downgrade.log'/>
<downgrade cmd='"%SOFTWARE%\packages\mozilla\install-extensions.cmd" Firefox %FXEXT% >c:\netinst\logs\%FXEXT%-downgrade.log'/>
<remove cmd='"%SOFTWARE%\packages\mozilla\remove-extensions.cmd" Firefox %FXEXT% >c:\netinst\logs\%FXEXT%-remove.log'/>
<remove cmd='cmd /c if exist "%CommonProgramFiles%\Mozilla Shared\Extensions\%FXEXT%\" rmdir /s /q "%CommonProgramFiles%\Mozilla Shared\Extensions\%FXEXT%\"' />
<remove cmd='cmd /c if exist "%CommonProgramFiles(x86)%\Mozilla Shared\Extensions\%FXEXT%\" rmdir /s /q "%CommonProgramFiles(x86)%\Mozilla Shared\Extensions\%FXEXT%\"' />
</package>
packages/firefox-ext-skel.xml
Skeleton file for adding new extension by copying "firefox-ext-skel.xml to "firefox-ext-(name).xml".
<!DOCTYPE firefoxextension [ <!ENTITY ext-name "XX"> <!ENTITY ext-key "XX-00"> <!ENTITY ff-extension SYSTEM "../templates/ff-extension.xml"> ]>
<packages>&ff-extension;</packages>
Change "XX" to name of extension, "XX-00" to extension key of the file.
Example: screengrab-0.96.3-fx.xpi
* XX -> screengrab * XX-00 -> 0.96.3-fx
packages/firefox36.xml
An additional "firefox check" package is used as dependancy in the extension template, as extensions do not depend from a certain firefox version and therefor need not to be removed when doing a upgrade later to the next firefox generation.
<?xml version="1.0" encoding="UTF-8"?>
<packages>
<package
id="firefox-check"
name="Mozilla Firefox 3 installed"
revision="1"
reboot="false"
priority="20">
<check type="file" condition="versiongreaterorequal" path="%programfiles%\mozilla firefox\firefox.exe" value="1.9.1.3642" />
</package>
<package
id="firefox36"
name="Mozilla Firefox 3"
revision="30612"
reboot="false"
priority="99">
<check type="file" condition="versiongreaterorequal" path="%programfiles%\mozilla firefox\firefox.exe" value="1.9.2.3951" />
<install cmd='%SOFTWARE%\tools\pskill.exe firefox.exe'>
<exit code="-1" />
</install>
<install cmd='cmd /c if exist "%programfiles%\mozilla firefox\firefox.exe" move /y "%programfiles%\mozilla firefox" "%programfiles%\mozilla firefox.bak"' >
<exit code="1" />
</install>
<install cmd='"%SOFTWARE%\packages\mozilla\firefox-30612-deu.exe" -ms' />
<install cmd='cmd /c if exist "%programfiles%\mozilla firefox.bak\searchplugins" copy /y "%programfiles%\mozilla firefox.bak\searchplugins\*" "%programfiles%\mozilla firefox\searchplugins\"' >
<exit code="1" />
<exit code="0" />
</install>
<install cmd='"%PROGRAMFILES%\Mozilla Firefox\firefox.exe" -CreateProfile default '>
<exit code="0" />
</install>
<upgrade cmd='%SOFTWARE%\tools\pskill.exe firefox.exe'>
<exit code="-1" />
</upgrade>
<upgrade cmd='"%SOFTWARE%\packages\mozilla\firefox-30612-deu.exe" -ms' />
<remove cmd='%SOFTWARE%\tools\pskill.exe firefox.exe'>
<exit code="-1" />
</remove>
<remove cmd="%PROGRAMFILES%\Mozilla Firefox\uninstall\helper.exe /s" />
</package>
</packages>
packages/firefox.xml
<?xml version="1.0" encoding="UTF-8"?>
<packages>
<package
id="firefox-check"
name="Mozilla Firefox installed"
revision="1"
reboot="false"
priority="20">
<check type="logical" condition="or">
<check type="file" condition="versiongreaterorequal" path="%programfiles%\mozilla firefox\firefox.exe" value="2.0.0.4094" />
<check type="file" condition="versiongreaterorequal" path="%programfiles(x86)%\mozilla firefox\firefox.exe" value="2.0.0.4094" />
</check>
</package>
<package
id="firefox"
name="Mozilla Firefox 8"
revision="%version%"
reboot="false"
priority="99">
<variable name="version" value="80001" />
<check type="logical" condition="or">
<check type="file" condition="versiongreaterorequal" path="%programfiles%\mozilla firefox\firefox.exe" value="8.0.1.4341" />
<check type="file" condition="versiongreaterorequal" path="%programfiles(x86)%\mozilla firefox\firefox.exe" value="8.0.1.4341" />
</check>
<install cmd='%SOFTWARE%\tools\pskill.exe firefox.exe'>
<exit code="-1" />
</install>
<install cmd='%COMSPEC% /c if exist "%programfiles%\mozilla firefox\firefox.exe" move /y "%programfiles%\mozilla firefox" "%programfiles%\mozilla firefox.bak"' >
<exit code="1" />
</install>
<install cmd='%SOFTWARE%\packages\mozilla\firefox-%version%-deu.exe -ms' />
<install cmd='%COMSPEC% /c if exist "%programfiles%\mozilla firefox.bak\searchplugins" copy /y "%programfiles%\mozilla firefox.bak\searchplugins\*" "%programfiles%\mozilla firefox\searchplugins\"' >
<exit code="1" />
<exit code="0" />
</install>
<install cmd='%COMSPEC% /c if exist "%programfiles(x86)%\mozilla firefox.bak\searchplugins" copy /y "%programfiles(x86)%\mozilla firefox.bak\searchplugins\*" "%programfiles%\mozilla firefox\searchplugins\"' >
<exit code="1" />
<exit code="0" />
</install>
<install cmd='%COMSPEC% /c if exist "%programfiles%\mozilla firefox" xcopy /v /s /i /e /h /c /y /q "%SOFTWARE%\packages\mozilla\fx_profile\*" "%programfiles%\mozilla firefox\"' >
<exit code="1" />
</install>
<install cmd='%COMSPEC% /c if exist "%programfiles(x86)%\mozilla firefox" xcopy /v /s /i /e /h /c /y /q "%SOFTWARE%\packages\mozilla\fx_profile\*" "%programfiles(x86)%\mozilla firefox\"' >
<exit code="1" />
</install>
<install cmd='%COMSPEC% /c if exist "%PROGRAMFILES%\Mozilla Firefox\firefox.exe" "%PROGRAMFILES%\Mozilla Firefox\firefox.exe" -CreateProfile default '>
<exit code="1" />
<exit code="0" />
</install>
<install cmd='%COMSPEC% /c if exist "%PROGRAMFILES(x86)%\Mozilla Firefox\firefox.exe" "%PROGRAMFILES(x86)%\Mozilla Firefox\firefox.exe" -CreateProfile default '>
<exit code="1" />
<exit code="0" />
</install>
<upgrade cmd='%SOFTWARE%\tools\pskill.exe firefox.exe'>
<exit code="-1" />
</upgrade>
<upgrade cmd='"%SOFTWARE%\packages\mozilla\firefox-%version%-deu.exe" -ms' />
<upgrade cmd='%COMSPEC% /c if exist "%programfiles(x86)%\mozilla firefox" xcopy /v /s /i /e /h /c /y /q "%SOFTWARE%\packages\mozilla\fx_profile\*" "%programfiles(x86)%\mozilla firefox\"' >
<exit code="1" />
</upgrade>
<upgrade cmd='%COMSPEC% /c if exist "%programfiles%\mozilla firefox" xcopy /v /s /i /e /h /c /y /q "%SOFTWARE%\packages\mozilla\fx_profile\*" "%programfiles%\mozilla firefox\"' >
<exit code="1" />
</upgrade>
<remove cmd='%SOFTWARE%\tools\pskill.exe firefox.exe'>
<exit code="-1" />
</remove>
<remove cmd="%PROGRAMFILES%\Mozilla Firefox\uninstall\helper.exe /s" />
</package>
</packages>
Remarks
There are reported problems (bugs ?) using quoted strings within cmd files. Egfor %zip% . You may have to replace
set zip="%SOFTWARE%\packages\mozilla\7-Zip\7z.exe"
set zip=%SOFTWARE%\packages\mozilla\7-Zip\7z.exe
For Windows non-specialists, it's possible to hunt bugs/problems redirecting cmd file output to a log file. Replace >NUL in the template file to some >> %SYSTEMDRIVE%\myplace\myfile.txt (for example).