Windows-way синхронизация настроек между системами

    Раз на хабре началась неделя powershell, то я решил самое время из черновика достать статью.
    В то самое время когда был ZverCD, я эксперементировал с ubunta'ой и искренне поражался почему не сделают единный репозиторий для программ windows. С тех пор прошло порядка 5 лет, и под windows появился пакетный менеджер. Хорошо в win10 сделали OneGet, но и без OneGet начали появляться аналоги. Своего рода прорывом был chocolatey. Собственно с написания скрипта под chocolatey началась моя эпопея по всеобщей тотальной синхронизации и переносимости. Каждая новая установка операционной системы, для меня выглядит запуском одного скрипта (в идеальном мире так и есть! ), с каждой новой установкой правда все более и более расширяемого. Этот рассказ о том какой софт я синхронизирую под windows чем и как.

    Каждый раз, когда надо переезжать с одного компа на другой, требуется установка среды привычной для меня. Это набор программ и настройка горячих клавиш. Сначала это был просто bat скрипт, но со временем он эволюционировал в powershell скрипт, с набором разных опциональных установок и заданий.
    @powershell -NoProfile -ExecutionPolicy unrestricted -Command                                                                                                                      
    "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))"                                                                                
    && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin                                                                                                                             
                                                                                                                                                                                                                                                
    choco install google-chrome-x64                                                                                                                                                                                  
    choco install sublimetext3                                                                                                                                                                                             
    choco install dropbox                                                                                                                                                                                                      
    choco install puntoswitcher                                                                                                                                                                                           
    choco install skype                                                                                                                                                                                                           
    choco install keepass                                                                                                                                                                                                      
    choco install keepass-keepasshttp                                                                                                                                                                               
    choco install git                                                                                                                                                                                                                
    choco install sysinternals                                                                                                                                                                                                
    choco install kdiff3                                                                                                                                                                                                          
    choco install gimp                                                                                                                                                                                                    
    choco install fiddler4                                                                                                                                                                                                      
    choco install tortoisegit                                                                                                                                                                                                 
    choco install tortoisesvn                                                                                                                                                                                                
    choco install evernote                                                                                                                                                                                                    
    choco install treesizefree                                                                                                 
    choco install teamviewerr                                                                                                  
                                                                                                                                                                                                  
    schtasks /Create /RU "Domain\Username" /SC ONLOGON /TN "autohotkey" /TR "D:\Dropbox\Apps\Autohotkey\runKeepass.exe" /IT /V1
                                                                                                                                                                                                                                                
    cd %AppData%\Roaming\Sublime Text 3\Packages\                                                                                                                                                
    mklink /D User "d:\Dropbox\Apps\Sublime Text 3\User"                                                                                                                                                
    cd /d "D:\Dropbox\Apps\powershell"                                                                                                                                                                          
    @powershell .\copy_to_profile.ps1                                                                                                                                                                     
                                                                                                                                                                                                                                                            


    Для установки программ, я использую chocolatey и скриптом запускаются первоначальные установки. Первое что делаем — скачиваем и устанавливает chocolatey, хотя в планах сделать еще проверку на win10 и OneGet.
    Set-ExecutionPolicy RemoteSigned -Force
    iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
    


    Info кто не хочет юзать choco на win10 машине, репозиторий сhocolatey придется добавить в trusted source, чтобы пакеты не были ограничены майкрософтовским репозиторием (в chocolatey в раз больше пакетов).

    Далее ставим софт на свой вкус, вот мой:
    • google-chrome-x64
    • skype
    • sublimetext3
    • dropbox
    • puntoswitcher
    • keepass
    • keepass-keepasshttp
    • sysinternals
    • kdiff3
    • paint.net
    • gimp
    • fiddler4
    • evernote
    • treesizefree
    • teamviewer
    • git
    • tortoisegit
    • tortoisesvn
    • nodejs
    • ant


    Добавляем чуть-чуть горячих клавиш autohotkey скрпитом:

    #k::
        Run "C:\Program Files (x86)\KeePass Password Safe 2\Keepass.exe"
    
    #IfWinActive ahk_class CabinetWClass ; for use in explorer.
        ^!Space::
            ClipSaved := ClipboardAll
            Send !d
            Sleep 200 ; In some cases timeout settings have to be adjusted
            Send ^c
            Run, powershell -noexit -command "$exist=Test-Path '%clipboard%'; if($exist){Set-Location '%clipboard%' }else{Set-Location 'c:\'}"
            Clipboard := ClipSaved
            ClipSaved =
            return
    #IfWinActive
    #IfWinNotActive
        ^!Space::Run, powershell -noexit -command "Set-Location 'c:\'"
    #IfWinNotActive
    


    Первая добавляет win+k на запуск keepass, база которого синхронизируется через dropbox. А вторая горячая клавиша через Ctrl+Alt+Space открывает powershell от админа (без админа как-то все совсем кастрированно, и удобного аналога sudo я не нашел). Причем если сейчас активно окно проводника, то консоль откроется именно там где он сейчас открыт. Есть еще удобное расширение для Visual Studio позволяющее открывать ps из окна солюшена: Open Command Line. Про него писал Хансельман, вот здесь Quake Mode Console for Visual Studio — Open a Command Prompt with a hotkey

    А чтобы этот скрипт работал правильно и из под админа (опять каюсь, дыра, но без админа не работают автохоткеи в тех приложениях что запущены под админом), то самый простой путь который я нашел, это сделать задание на вход в систему, примерно таким образом:
    schtasks /Create /RU "Domain\Username"    /SC ONLOGON /TN "autohotkey" /TR "D:\Dropbox\Apps\Autohotkey\runAutohotkey.exe" /IT /V1


    Теперь приступим к синхронизации настроек приложений. Первое что синхронизируем это Sublime Text. Процесс синхронизации описан хорошо здесь. tl;dr делаем символьную ссылку на папку dropbox'а для папки User из %AppData%\Roaming\Sublime Text 3\Packages:

    cd %AppData%\Roaming\Sublime Text 3\Packages\                                                                                                                                                
    mklink /D User "d:\Dropbox\Apps\Sublime Text 3\User"                                                                                                                                                                                   
    


    Для синхронизации настроек Visual Studio, SQL Management Studio используются стандартные диалоги выгрузки и загрузки настроек в виде xml. Главная проблема заключается в том, что генерируемый файл в формате xml просто дампит все указанные настройки при экспорте, и это мало юзабельно. Хотелось бы наследования от стандартной конфигурации general, или от c# для студии, и потом переопределять свои настройки Хорошо это решается в 2013 visual studio там это сделали через синхронизацию профиля visual studio online (подробности msdn). Но что если нам надо просинхронизировать 2010, 2013, 2015, да и просто держать под контролем эти настройки, для этого приходится делать несколько разных выгрузок конкретных настроек (шортакаты, настройки текстового редактора), и потом сравнивать с дефолтной. Ну порнография в общем, по другому не сказать.

    Еще естественно хочется чтобы такие же шортакты были и в Sublime Text и в WebStorm, и стандартного решения, я пока не нашел. Есть хороший плагин для синхронизации настроек цветовой схемы, табы/пробелы, и кучу других настроек форматирования, но к сожалению он не поддерживает синхронизацию горячих клавиш. Тем не менее он стоит упоминания: EditorConfig (офф.сайт). Плагин активно развивается, и много чего ребята пилят/допиливают. Расширения для студии, тоже единственный способ синхронизации, который я нашел: сохранять файлы vsix расширений, и устанавливать их через VSIXInstaller. Строка запуска такая:

    cd "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" .\VSIXInstaller.exe "D:\Dropbox\Apps\Visual Studio\extensions\VSColorOutput.vsix"    
    


    Но т.к. расширения периодически устаревают, и идея хранить бинарники в dropbox меня как-то не впечатлила, ничего лучше, чем пройтись по списку в Evernote, и скачать их руками, я не нашел.

    Небольшое отклонение от темы. Кроме расширений для студии, еще теперь я сохраняю скрипты для vcmd. Теоритически, у меня они сохранены на стековерфлоу, где разработчик очень активно отвечает на вопросы по тегу visual-studio. Пара примеров:
    Команда для копирования текущего местоположения в файле
    using EnvDTE;
    using EnvDTE80;
    
    public class C : VisualCommanderExt.ICommand
    {
    	public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
    	{
    		EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection;
    if (ts == null)
      return;
    EnvDTE.CodeFunction func = ts.ActivePoint.CodeElement[vsCMElement.vsCMElementFunction]
                as EnvDTE.CodeFunction;
    if (func == null)
      return;
    
    string result = DTE.ActiveWindow.Document.FullName + System.Environment.NewLine +
      "Line " + ts.CurrentLine + System.Environment.NewLine +
      func.FullName;
    System.Windows.Clipboard.SetText(result);
    	}
    }
    

    Автосохранение файлов при потере фокуса окна, Jetbrains-like
    public class E : VisualCommanderExt.IExtension
    {
    	public void SetSite(EnvDTE80.DTE2 DTE_, Microsoft.VisualStudio.Shell.Package package)
    	{
    		DTE = DTE_;
    		System.Windows.Application.Current.Deactivated += OnDeactivated;
    	}
    
    	public void Close()
    	{
    		System.Windows.Application.Current.Deactivated -= OnDeactivated;
    	}
    
    	private void OnDeactivated(object sender, System.EventArgs e)
    	{
    		try
    		{
    			DTE.ExecuteCommand("File.SaveAll");
    		}
    		catch (System.Exception ex)
    		{
    		}
    	}
    
    	private EnvDTE80.DTE2 DTE;
    }
    


    Для разворачивание powershell профиля я написал такой скриптик:
    cd /d "    "D:\Dropbox\Apps\powershell"                                                                                                                                                                          
    @powershell .\copy_to_profile.ps1                                                                                                                                                                     
    


    Сам же скрипт из себя представляет следующий код
    $scriptRoot = Split-Path $MyInvocation.MyCommand.Path
    
    $profileFileInfo = New-Object System.IO.FileInfo $PROFILE
    
    $profileExist = Test-Path $profile
    $modulesFolder = [System.IO.Path]::Combine($profileFileInfo.Directory,"Modules")
    
    if(-not ((Test-Path $profile) -AND (Test-Path $modulesFolder)))
    {
        Write-Host "Creating directories"
        New-Item -ItemType directory -path $profileFileInfo.Directory -ErrorAction SilentlyContinue
        New-Item -ItemType directory -path $modulesFolder
    }
    
    
    
    Copy-Item -Path $scriptRoot\Microsoft.PowerShell_profile.ps1 -Destination $profile
    Get-ChildItem Modules -Recurse |%{ Copy-Item $_.FullName -Destination $modulesFolder -Force}
    
    Write-Host "Profile was updated"
    


    Что происходит в скрипте профиля: устанавливаются более трушные ( ;) ) цвета консоли и подгружаются все скрипты и модули из папки c Dropbox'а. В этих скриптах различные снипеты, заготовленные командлеты и прочие прелести, модули, например posh-git. Со временем в этой папке накопилось уже прилично скриптов, без которых я не представляю эффективную работу с ps. Но если у вас нет большого опыта написания таких командлетов, то можете посмотреть интерсные скрипты здесь: microsoft scriptcenter. Еще очень удобная тула для скриптинга: Script Browser & Script Analyzer 1.4

    Небольшой p.s. вместо окончания. Сама статья писалась в течении пары лет по абзацу, поэтому некоторые данные могли устареть. Из открытых вопрос синхронизация горячих клавиш, если у кого есть рецепт, буду премного благодарен. Еще вопрос скриптинга для студии тоже открыт, т.к. расширение отличное, но 39$ на мой взгляд достаточно большая сумма для расширения (тот же resharper можно за 100$ на распродаже взять). Смещение стека утилит все таки с уклоном на .net стек, потому что основная рабочая среда. Для того же WebStorm, IDEA, я так понял они сами какой-то магией синхронизируются на компе, а кастомных клавиш я не биндил.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 21

    • UFO just landed and posted this here
        0
        И сейчас без особых сложностей принимает. Проблемы могут возникать из-за guid учетки, который некотоые программы любят тящить с собой. Еще между разными версиями винды нельзя простой подменой делать перенос (как межу 32 и 64 редакциями, так и между версиями Windows).
        • UFO just landed and posted this here
          0
          А с софтом как быть?
          0
          По-настоящему windows-way — это написание правил для USMT. А за Chocolatey спасибо, интересная штука.
            0
            Ого, я не знал, мне кажется это следующий lvl....
            0
            Я бы рекомендовал portableapps.com с очень приличным набором портативных приложений, перенос которых с компьютера на компьютер сводится к копированию папки portableapps с всем ее содержимым
              0
              Вопрос в необходимости таскания с собой винчестера. И постоянно копировать на него актуальный слепок этой папки. Ну и облака там, 2016 год, все дела.
                0
                кто мешает хранить папку portableapps в облаке, в том же dropbox'е? тогда и копировать ничего вручную не придется, все само приедет на новый компьютер
                  0
                  Ну у меня есть два аргумента против.
                  1) идея хранить бинарники в облаке мне не нравится
                  2) обновление программ
                    0
                    Портативный Firefox обновляется также легко, как и настоящий. У других с этим делом похуже, но если приложение некритичное в плане безопасности, то можно и обновлять время от времееи вручную или не обновлять вовсе.
                    А что может быть страшного в хранении какого-нибудь scanner.exe который я использую вместо treesize
              0
              Отличный пример, спасибо!
              Теперь можно хранить свои windows-"dotfiles" в github так же просто как и в *nix.
                0

                Да, с момента публикации статьи, практически полностью перешел на dotfile'ы ))) скрипт-бутстраппер уже и не нужен, только симлинки создать

                +1
                Напомню про Ninite
                0
                в этой папке накопилось уже прилично скриптов, без которых я не представляю эффективную работу с ps

                А можно поподробнее, плиз.
                  0
                  можно, только не знаю как. Или отдельным постом, или в этот добавить, или в комент запихнуть.
                    0
                    Да наверное отдельным постом, чтобы народ в комментах накидал своих полезных скриптов. Обмен опытом это всегда хорошо.
                  0
                  choco удобная штука, по psremoting прицепляюсь к нужному клиенту, ставлю choco с софтом.

                  автообновление проиходит само, таким образом нет необходимости давать клиенту админский пароль, софт можно доставить или удалить, обновляться все будет одной командой — choco upgrade all которую можно вытолкнуть как со своего компа так и скомпа клиента через шедулер. для структуры с ноутбучниками и любителями постоянно обновляющегося софта типа жавы и акробата самое то.
                  0
                  Вот как бы еще автоматом поставить SlimDrivers и чтобы он все драйверы, не требуя кликинга поставил...

                  Only users with full accounts can post comments. Log in, please.