Началось это из-за дружеского многомесячного вялотекущего холивара «Linux vs. Windows» между мной и нашим сис.админом.
Однажды была затронута проблема о защищенности системы и пользовательских каталогах. Встала задача показать что в Windows есть полноценный аналог линуксового %home%.
Старые виндопользователи знают, что пользовательские настройки начали храниться в специально для этого предназначенном каталоге еще в Windows 9х. Но это было мягко говоря «совсем не то». (Update: в комментах поправляют: это появилось еще в NT 3, причем сразу с хорошей реализацией.)
С приходом NT 5 (Win2k, WinXP), где был безопасности уделили больше внимания, все пользовательские профили стали храниться в той самой «Documents and Settings». Правда при желании и прямых руках это может быть и другой каталог, например «Users».
Примерно тогда же появились глобальные переменные для указания текущего пользователя и его домашнего каталога. Видать, навеяло из мира Linux. Имхо, ничего зазорного в этом нет 🙂
Узнать значение всех глобальных переменных можно выполнив команду SET в командной строке. Для тех кто совсем в танке: Win+R, печатаем cmd, жмем Enter, печатаем set, жмем Enter.
Текущие гайдлайны Майкрософта рекомендуют использовать именно глобальные переменные, для того чтобы выяснить, где программе можно хранить свои настройки. К сожалению, многие это игнорируют, а некоторые и вовсе до сих пор упорно хранят файл с настройками в своей директории. Руки бы поотрывал.
Поспорили мы немного о пользовательских каталогах да забыли до поры до времени.
Пока однажды при очередном обновлении FireFox-а на официальном сайте я не нашел его портативной версии. Хотелось свежую и именно портативную версию. Тут я вспомнил, что FireFox кроссплатформенный, и скорее всего в Linux-е он хранит настройки «там, где надо». И скорее всего в Windows он хранит их там же. И выясняет, куда хранить «как надо» — через глобальные переменные. Чай разработчики FireFox-а профессионалы своего дела.
Итак, у нас на руках Windows XP, установленный FireFox последней версии и желание получить его портативный вариант.
Глобальные переменные инициилизируются при запуске Windows и входе пользователя в систему. Новый процесс получает значение глобальных переменных от родительского. Чаще всего родительским процессом является Explorer. Но каждый процесс может переопределить любую глобальную переменную, но это новое значение переменой будет доступно только этому процессу и его дочерним процессам. У родительского процесса все останется по старому.
Переопределить глобальную переменную в командном интерпретаторе cmd можно той же командой set.
Значит можно в cmd переопределить переменную, запустить нужную программу, завершить работу cmd. Profit!
Мысль только оформилась, а руки уже начали ваять скрипт. Для начала выясняем где FireFox хранит наш настройки/профили. Это оказались
c:\Documents and Settings\Гость\Local Settings\Application Data\Mozilla\
и
c:\Documents and Settings\Гость\Application Data\Mozilla\
Сам FireFox-профиль лежит здесь
c:\Documents and Settings\Гость\Application Data\Mozilla\Firefox\Profiles\
и у меня назывался «6rynxm6u.default». Случайная комбинация символов. У вас может быть другая.
В каталоге FireFox-а создаем папку «toxicdream» (ну или как вы захотите) — это будет нашим тем самым %home%. Внутри нее создаем «\Local Settings\Application Data\» и «\Application Data\Mozilla\». Найденные выше каталоги «Mozilla» переносим в соответствующие.
Смотрим какие переменные Windows могут нам помочь:
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Гость\Application Data
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\Гость
USERNAME=Гость
USERPROFILE=C:\Documents and Settings\Гость
Попробуем обойтись малой кровью — перекрываем только APPDATA и смотрим что получилось. Создаем
в каталоге Firefox файл «firefox.cmd» с текстом
%~d0% cd %~dp0% set APPDATA=%~dp0%toxicdream\Application Data start firefox.exe
Первые две строки указывают, что надо переключиться на диск и перейти в каталог, где лежит сам файл «firefox.cmd», чтобы рабочий каталог для запускаемого FireFox был именно этот каталог.
Запускаем. Ну почти получилось — профиль пользователя грузится.
С «Local Settings» придется повозиться. После перекрытия USERPROFILE и USERNAME лисичка все равно лезет не туда куда ей сказали. Надо перекрыть еще HOMEPATH и соответственно HOMEDRIVE
%~d0% cd %~dp0% set APPDATA=%~dp0%toxicdream\Application Data set HOMEDRIVE=%~d0% set HOMEPATH=%~p0%toxicdream set USERNAME=toxicdream set USERPROFILE=%~dp0%toxicdream start firefox.exe
Ну а чтобы уж наверняка перекроем еще ALLUSERSPROFILE и TEMP/TMP. Итоговый скрипт такой
%~d0% cd %~dp0% set ALLUSERSPROFILE=%~dp0%toxicdream set APPDATA=%~dp0%toxicdream\Application Data set HOMEDRIVE=%~d0% set HOMEPATH=%~p0%toxicdream set TEMP=%~dp0%toxicdream\Local Settings\Temp set TMP=%~dp0%toxicdream\Local Settings\Temp set USERNAME=toxicdream set USERPROFILE=%~dp0%toxicdream start firefox.exe
Напоминаю — это для Windows 5.x, то есть Windows 2000, Windows XP и Windows 2003.
Текст скрипта для Win7:
%~d0% cd %~dp0% set ALLUSERSPROFILE=%~dp0%toxicdream set APPDATA=%~dp0%toxicdream\Application Data set HOMEDRIVE=%~d0% set HOMEPATH=%~p0%toxicdream set LOCALAPPDATA=%~dp0%toxicdream\Application Data\Local set TMP=%~dp0%toxicdream\Application Data\Local\Temp set TEMP=%~dp0%toxicdream\Application Data\Local\Temp set USERNAME=toxicdream set USERPROFILE=%~dp0%toxicdream start firefox.exe
Ну вот, теперь все работает как часы. Можно даже обновляться с сохранением всех настроек. И не надо никого ждать или мучаться с ThInstall и ему подобными. Правда тут всплывает еще один эффект: все (ну или почти все) программы запущенные из нашего FireFox будут использовать наш каталог «toxicdream» для своей работы. Поэтому не удивляйтесь если вдруг например, Download Master начнет показывает список загрузок то так, то этак.
PS
В Viste и Seven профиль Firefox-а хранится в другом месте. Плюс там еще добавили переменную для того самого «Local Settings», вернее уже «Local» — %LOCALAPPDATA%.
Придется при каждой смене системы перемещать файлы из «Local Settings» в «Application Data\Local».
Можно это все также прописать в скрипте. К сожалению у меня сейчас под рукой нет Win7, поэтому оставляю это для доработки следующими энтузиастами.
Для затравки: выяснить версию Windows можно командой ver. Тут есть небольшие грабли — вывод команды отличается от версии к версии, и может быть, от языка системы. Код, выявляющий версию однозначно:
echo off for /f "usebackq tokens=2 delims=[]" %%i in (`ver`) do set osver=%%i for /f "usebackq tokens=2 delims=. " %%i in (`set osver`) do set osver=%%i if %osver% == 6 ( echo Win7 or Vista ) else if %osver% == 5 ( echo W2k or XP ) pause
UPD 1
> запустив файрфокс вот так: firefox -profile «E:\myprofile» мы достигаем нашей цели. То есть надо создать ярлык и всё будет работать как надо
Минусы:
— жесткая привязка к путям
— создание/модификация ярлыка
— мусор в «Local Settings»
UPD 2
> портативный огнелис гуглится не просто быстро, а очень быстро — mozilla-russia.org/products/firefox/ — раз и portableapps.com/apps/internet/firefox_portable — два.
Минусы:
— не всегда последняя версия
— лишний процесс в памяти
— иногда возникают проблемы при обновлении, например, лично у меня были при переходе на Windows 7
UPD 3
> Почему в блоге «Огненный лис»?
Мне показалось для пользователей Огнелиса будет интересней.
Для блога Windows слишком элементарный уровень.