Раз на хабре началась неделя 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%chocolateybin
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 "DomainUsername" /SC ONLOGON /TN "autohotkey" /TR "D:DropboxAppsAutohotkeyrunKeepass.exe" /IT /V1
cd %AppData%RoamingSublime Text 3Packages
mklink /D User "d:DropboxAppsSublime Text 3User"
cd /d "D:DropboxAppspowershell"
@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 2Keepass.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 "DomainUsername" /SC ONLOGON /TN "autohotkey" /TR "D:DropboxAppsAutohotkeyrunAutohotkey.exe" /IT /V1
Теперь приступим к синхронизации настроек приложений. Первое что синхронизируем это Sublime Text. Процесс синхронизации описан хорошо здесь. tl;dr делаем символьную ссылку на папку dropbox'а для папки User из %AppData%RoamingSublime Text 3Packages:
cd %AppData%RoamingSublime Text 3Packages
mklink /D User "d:DropboxAppsSublime Text 3User"
Для синхронизации настроек 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.0Common7IDE" .VSIXInstaller.exe "D:DropboxAppsVisual StudioextensionsVSColorOutput.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:DropboxAppspowershell"
@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 $scriptRootMicrosoft.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, я так понял они сами какой-то магией синхронизируются на компе, а кастомных клавиш я не биндил.
Автор: IamKarlson