2017-04-13 91 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)