-->

пятница, 22 января 2016 г.

Запускаем исполняемые файлы через PowerShell. Боли нет.

Часто ли вам приходится запускать исполняемые файлы с десятком-другим параметров? Например:
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" ^ -source:package='long\way\to\package\foo.zip' ^
-dest:auto,computerName="https://another-app.scm.azurewebsites.net/msdeploy.axd?site=aaa",userName="bbb",password="ccc7",authtype="basic",includeAcls="False" ^
-verb:sync ^
-setParamFile:"long\way\to\package\foo.SetParameters.xml" ^
-AllowUntrusted ^
-setParam:"IIS Web Application Name"=homesweethome ^
-verbose
Если мне предстоит запустить подобного монстра более 2 раз за всю свою жизнь, я пишу скрипт на PowerShell, который сформирует список параметров, соединит список в результирующую строку, выполнит команду, да и еще поделится со со мной полезной отладочной информацией. Будь то шаг развертывания приложения через билд-сервер, запуск какой-либо тестовой утилиты - подобный подход в сочетании с системой управления версиями снижает сложность разработки и поддержки на порядки.

Начнем с того, что PowerShell предлагает различные способы запуска исполняемых файлов, такие как:
  • оператор &
  • Start-Process
  • Invoke-Expression
  • Start-Executable 
Приведу пример вызова Start-Process, т.к. обычно использую этот командлет:

Start-Process $msdeploy_exe -ArgumentList $params -NoNewWindow -Wait

Видите? Всё просто! А если список параметров собрать, используя знакомый любому .NET разработчику класс List<T>, то и код будет понятен любому коллеге (я надеюсь):

$list = New-Object -TypeName "System.Collections.Generic.List[string]"
 
$dest_template = '-dest:auto,computerName="https://{0}.scm.azurewebsites.net/msdeploy.axd?site={0}",userName="aaa",password="bbb",authtype="basic",includeAcls="False"'
 
$list.Add([string]::Format($dest_template, $web_url))
$list.Add([string]::Format("-source:package={0}", $package_path))
$list.Add([string]::Format("-setParamFile:{0}", $setparameters_path))
$list.Add([string]::Format("-setParam:'IIS Web Application Name'={0}", $web_url))
$list.Add("-verbose")
$list.Add("-verb:sync")
$list.Add("-AllowUntrusted")
 
# ensure space between params
$params = [string]::Join(" ", $list)

Да, интеграция со всей платформой .NET Framework - это неоспоримый плюс PowerShell-скриптов! По сравнению с первоначальным вариантом, читабельность и легкость сопровождения повысились в разы! На этом я заканчиваю пятиминутку в стиле Капитана Очевидность, и желаю всем поменьше рутины и побольше интересных задач!


Комментариев нет:

Отправить комментарий