2016-12-23 28 views
0

因此,我正在嘗試編寫一個Powershell腳本來創建數據庫的備份,壓縮備份並將其上載到FTP站點。這裏是我的腳本的一部分使Powershell等待SQL腳本/查詢完成

示例腳本/代碼:

Write-Host "Backup of Database " $databaseName " is starting" 
push-location 

Invoke-Sqlcmd -Query "--SQL Script that backs up database--" -ServerInstance "$serverName" 

pop-location 
Write-Host "Backup of Database " + $databaseName " is complete" 

#Create a Zipfile of the database 
Write-Host "Compressing Database and creating Zip file...." 
sz a -t7z "$zipfile" "$file" 
Write-Host "Completed Compressing Database and creating Zip file!" 

我想阻止後的任何代碼「援引-SQLCMD .......」,直至其執行部分備份數據庫的SQL腳本已完成,因爲壓縮線無法找到數據庫的備份,因爲備份需要相當長的時間才能完成。

我對使用Powershell非常陌生,並不十分理解其他可能相關的問題,我發現它們提供了一個解決方案,因爲我以不同的方式調用SQL語句。

可能的相關問題:

Get Powershell to wait for an SQL command to execute

Powershell run SQL job, delay, then run the next one

+0

如果你把它們放入一個函數並等待返回,該怎麼辦?沒有異步。 – johnny

+0

你有什麼想法可以在退貨時檢查嗎?該腳本將替換現有的備份,因此我無法檢查文件是否存在。 –

+2

'Invoke-SqlCmd'已經是一個同步cmdlet。如果要進行下一步,那是因爲該聲明已完成執行。 –

回答

1

你確定你的心不是...script that backs up the database只是拋出一個錯誤和PS繼續?

這似乎表明,它實際上等待這一呼籲:

Write-Host "starting" 
push-location 

Invoke-Sqlcmd -Query "waitfor delay '00:00:15';" -ServerInstance "$serverName" 

pop-location 
Write-Host "complete" 

在任何情況下,你應該警惕現有的文件,方法是放棄,如果該文件不存在,或者輪詢,直到它(當我將.bak文件寫入磁盤時,我不是100%)。

# abort 
if(!(test-path $file)) { 
} 

# or, poll 
while(!(test-path $file)) {  
    start-sleep -s 10; 
}