2017-04-13 90 views
0

我已经添加了一个步骤来将我们的数据库迁移到Octopus Deploy中的我们的开发服务器。我试图创建一个PowerShell脚本来做到这一点。在用于此部署的Nuget包中,我的可执行文件migrate.exe位于\Resources\试图在章鱼部署中的powershell脚本中执行exe

我写剧本是这样的:

$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) 

但我得到这个消息:

&:术语” \资源\ migrate.exe --assembly “数据库\ bin \ Debug \ Database.dll“--provider sqlserver2014 --connection”data source = $ dbServer; initial catalog = ClarkChains; user id = $ dbUser; password = $ dbPass; persist security info = true; MultipleActiveResultSets = True “-o”不被识别为名称 cmdlet,函数,脚本文件或可操作程序。

我四处寻找关于如何正确调用可执行文件的示例。

+0

'Write-Host(Get-Location).Path' - 会告诉你你在章鱼部署目标机器中的位置。 –

+0

听起来像.exe包含在软件包中。如果是这种情况,可以使用内置的章鱼变量来检索安装路径和设置位置。另外请注意,你在单引号字符串中有powershell变量,这就是为什么你的错误消息有$ dbServer而不是值。 –

回答

0

上面使用的结构并不正确,但看起来像环境结构不正确。看看以下内容,

如果migrate.exe文件不存在,您将收到您在此发布的错误。

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

这表示环境问题,而不是脚本问题。 您可以解决此问题的方法包括以下内容。

A>定义完整路径
B>为脚本设置新位置。

E.g.如果 '的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文件是否存在于目标位置即可。

好运:) :)

+0

看起来好像Powershell认为包括参数在内的整个命令都是可执行文件的名称 –

+0

我想知道我在OctopusDeploy环境中的位置。 –

1

亚当的评论基本上钉了它。

Octopus有很多内置变量,其中包括当前部署的软件包目录的变量。 在系统变量documentation给你你要找的人: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") 

(对不起,不保持语法高亮,但所有的语法混乱的转义字符,因为它不支持语法高亮的PowerShell)

相关问题