Попытка выполнить exe в сценарии PowerShell в развертывании осьминога

Я добавил шаг для переноса нашей базы данных на наш сервер разработки в Octopus Deploy. Я пытаюсь создать для этого сценарий PowerShell. В пакете Nuget для этого развертывания мой исполняемый файл migrate.exe находится в \Resources\.

Я написал такой сценарий:

$dbServer = $OctopusParameters["DBServer"]
$dbUser = $OctopusParameters["DBUser"]
$dbPass = $OctopusParameters["DBPass"]

Write-Host ("Running migration " + $dbServer)

$CMD = ".\Resources\migrate.exe"
$arg1 = '--assembly "Database\bin\Debug\Database.dll" --provider sqlserver2014'
$arg2 = '--connection "data source=$dbServer;initial catalog=MyDB;user id=$dbUser;password=$dbPass;persist security info=true;MultipleActiveResultSets=True" -o'

& $CMD $arg1 $arg2

Write-host("Migration finished " + $dbServer)

Но я получаю такое сообщение:

&: Термин '. \ Resources \ migrate.exe --assembly "Database \ bin \ Debug \ Database.dll" --provider sqlserver2014 --connection "источник данных = $ dbServer; исходный каталог = ClarkChains; идентификатор пользователя = $ dbUser ; password = $ dbPass; persist security info = true; MultipleActiveResultSets = True "-o" не распознается как имя командлета, функции, файла сценария или работающей программы.

Я искал примеры того, как правильно вызвать исполняемый файл.


person M Kenyon II    schedule 13.04.2017    source источник
comment
Write-Host (Get-Location).Path - сообщит вам, где вы находитесь на целевой машине развертывания Octopus.   -  person Alex M    schedule 16.04.2017
comment
похоже, что .exe включен в пакет. Если это так, вы можете использовать встроенные переменные осьминога, чтобы получить путь установки и установить там местоположение. Также обратите внимание, что у вас есть переменная powershell внутри строки в одинарных кавычках, поэтому в вашем сообщении об ошибке вместо значения было $ dbServer.   -  person Adam Bezverkov    schedule 02.05.2017


Ответы (2)


Комментарий Адама в основном решает эту проблему.

Octopus имеет множество встроенных переменных, в том числе переменную для каталога пакета вашего текущего развертывания. В документации по системным переменным вы найдете то, что вы ищете : Octopus.Tentacle.CurrentDeployment.PackageFilePath

И, как заметил Адам, если вы хотите использовать переменные внутри строки, вам нужно заключить строку в двойные кавычки. PowerShell не будет оценивать переменные или выражения, когда вы используете одинарные кавычки.

Кроме того, поскольку вы используете строки в двойных кавычках внутри $arg1 и $arg2, вам нужно избегать двойных кавычек внутри этих строк с помощью обратного апострофа `, поскольку они необходимы для передачи параметров в migrate.exe.

Ваш сценарий должен выглядеть примерно так:

Set-Location $Octopus.Tentacle.CurrentDeployment.PackageFilePath

$dbServer = $OctopusParameters["DBServer"]
$dbUser = $OctopusParameters["DBUser"]
$dbPass = $OctopusParameters["DBPass"]

Write-Host ("Running migration $dbServer")

$CMD = ".\Resources\migrate.exe"
$arg1 = "--assembly `"Database\bin\Debug\Database.dll`" --provider sqlserver2014"
$arg2 = "--connection `"data source=$dbServer;initial catalog=MyDB;user id=$dbUser;password=$dbPass;persist security info=true;MultipleActiveResultSets=True`" -o"

& $CMD $arg1 $arg2

Write-host("Migration finished $dbServer")

(Извините за то, что не сохранили подсветку синтаксиса, но все escape-символы испортили синтаксис, поскольку он не поддерживает подсветку синтаксиса для PowerShell)

person trbox    schedule 18.06.2017

Структура, которую вы используете выше, не является неправильной, скорее похоже, что среда структурирована неправильно. Взгляните на следующее,

ЕСЛИ файл migrate.exe не существует, вы получите сообщение об ошибке, которое вы разместили здесь.

& : The term '.\file.exe' is not recognized as the name of a cmdlet, ......

Это указывает на проблему со средой, а не на проблему со сценарием. Способы решения этой проблемы включают следующие.

A> Определите полный путь
B> Установите новое местоположение для сценария.

Например. Если 'file.exe' находится в C: \ temp \ mytemp \ file.exe, выполните в сценарии следующие действия:

$CMD = 'C:\temp\mytemp\file.exe'

ИЛИ вы можете продолжать использовать свой скрипт следующим образом:

$CMD = '.\mytemp\file.exe'
Set-Location 'C:\temp\'

Так файл будет найден. Таким образом, вам нужно либо изменить расположение сценария консоли, либо указать полный путь к файлу.
Если вы не хотите этого делать, я бы порекомендовал следующее:

$myLocation = Get-Location
Set-Location 'C:\temp\'
& $CMD $arg1 $arg2
Set-Location $myLocation.Path

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

Просто убедитесь, что exe-файл существует в целевом расположении.

Удачи :)

person jaradsc    schedule 14.04.2017
comment
Похоже, Powershell считает, что вся команда, включая аргументы, является именем исполняемого файла. - person Ross Presser; 14.04.2017