Раз на хабре началась неделя 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, я так понял они сами какой-то магией синхронизируются на компе, а кастомных клавиш я не биндил.

Комментарии (19)


  1. Ivan_83
    08.03.2016 10:54

    В до вистовые времена можно было просто копировать профиль целиком, и после некоторых не сложных манипуляций система принимала его как родной.
    Плохо что мс это убило, это была одна из многих причин почему я перестал пользоваться их поделиями.


    1. MagicGTS
      08.03.2016 11:27

      И сейчас без особых сложностей принимает. Проблемы могут возникать из-за guid учетки, который некотоые программы любят тящить с собой. Еще между разными версиями винды нельзя простой подменой делать перенос (как межу 32 и 64 редакциями, так и между версиями Windows).


      1. Ivan_83
        11.03.2016 10:02

        Хз, я просто брал копировал весь профиль, переставлял систему, потом заводил учётку с таким же логином, логинился один раз, потом выходил, удалял созданный профиль, копировал вместо него тот что сохранял ранее и… в ХР нужно было сбросить права в реестре и на файлы а в семёрке оно не работает никак.

        2 IamKarlson:
        Портабле версии лепить в профиль, если оч надо.
        Я делал просто папку Files/Programs, и туда ставил всякие портабле нужные и прочие проги которым пофиг на установку, переносил винраром, с правами доступа (там права стояли так что изменять исполняемые файлы было нельзя, только конфиги, если они у софтины в каталоге стояли).
        Сейчас на фрю переехал и вообще проблем нет, просто rsync~ом на любой приглянувшийся+подходящий носитель копирую систему с профилем, софтом и всеми настройками, потом редактирую пару файлов чтобы бутилось и всё.

        2 navion:
        Нету виндового пути, НЕТУ и не было. В каждой версии свои приколы были.
        Виндовс идеология это:
        1. семь бед один ресет (в основном до ХР эпоха)
        2. проще=быстрее систему переустановить чем вылечить/исправить
        3. проще мышкой настроить с нуля чем пытаться перенести настройки


    1. IamKarlson
      08.03.2016 15:49

      А с софтом как быть?


  1. navion
    08.03.2016 19:12

    По-настоящему windows-way — это написание правил для USMT. А за Chocolatey спасибо, интересная штука.


    1. IamKarlson
      09.03.2016 07:25

      Ого, я не знал, мне кажется это следующий lvl....


  1. alk
    08.03.2016 23:08

    Я бы рекомендовал portableapps.com с очень приличным набором портативных приложений, перенос которых с компьютера на компьютер сводится к копированию папки portableapps с всем ее содержимым


    1. IamKarlson
      09.03.2016 07:20

      Вопрос в необходимости таскания с собой винчестера. И постоянно копировать на него актуальный слепок этой папки. Ну и облака там, 2016 год, все дела.


      1. alk
        09.03.2016 09:51

        кто мешает хранить папку portableapps в облаке, в том же dropbox'е? тогда и копировать ничего вручную не придется, все само приедет на новый компьютер


        1. IamKarlson
          09.03.2016 12:16

          Ну у меня есть два аргумента против.
          1) идея хранить бинарники в облаке мне не нравится
          2) обновление программ


          1. alk
            09.03.2016 13:38

            Портативный Firefox обновляется также легко, как и настоящий. У других с этим делом похуже, но если приложение некритичное в плане безопасности, то можно и обновлять время от времееи вручную или не обновлять вовсе.
            А что может быть страшного в хранении какого-нибудь scanner.exe который я использую вместо treesize


  1. kvaps
    09.03.2016 11:53

    Отличный пример, спасибо!
    Теперь можно хранить свои windows-"dotfiles" в github так же просто как и в *nix.


  1. varnav
    09.03.2016 17:57
    +1

    Напомню про Ninite


    1. belonesox
      11.03.2016 18:20

      Тогда еще стоит упомянуть http://allmyapps.com/


  1. PNAGAEV
    10.03.2016 09:17

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

    А можно поподробнее, плиз.


    1. IamKarlson
      10.03.2016 09:49

      можно, только не знаю как. Или отдельным постом, или в этот добавить, или в комент запихнуть.


      1. PNAGAEV
        10.03.2016 10:52

        Да наверное отдельным постом, чтобы народ в комментах накидал своих полезных скриптов. Обмен опытом это всегда хорошо.


  1. pak-nikolai
    10.03.2016 22:53

    choco удобная штука, по psremoting прицепляюсь к нужному клиенту, ставлю choco с софтом.

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


  1. belonesox
    11.03.2016 18:23

    Вот как бы еще автоматом поставить SlimDrivers и чтобы он все драйверы, не требуя кликинга поставил...