Powershell脚本自动删除,下载和还原未完全​​执行的SQL数据库

时间:2018-12-17 22:19:32

标签: sql powershell winscp

在一些在线资源的帮助下,我编译了一个PowerShell脚本,该脚本将:

  • 删除设置文件夹中超过60分钟的任何文件
  • 连接到SFTP服务器并下载一个.bak文件
  • 将下载的.bak文件恢复到SQL实例

如果我将其分解并单独运行,则代码可以正常工作。但是,当我组合它们时,它会一直运行到还原为止,然后停止。下面是代码。任何有助于确定为什么我可以选择还原脚本,仅运行还原脚本且可以正常运行的帮助,但是当整体运行时却无济于事。

更新1:我已经创建了简化的代码版本,该代码仍然不起作用,但仅具有使用WINSCP的连接,杀死SSMS的过程并还原。杀死进程只是让我看到它正在执行的视觉队列。

更新2:我发现将还原脚本放入session.open中可以正常运行。但是我不满意让会话保持打开状态,因为sql会还原它,感觉...我不知道如何放置它,但是错了。

$localPath = "C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\Backup\"

# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"

# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "url.com"
    UserName = "username"
    Password = "password"
    SshHostKeyFingerprint = "ssh stuff"
}

$session = New-Object WinSCP.Session
    try
    {
        # Connect
        $session.Open($sessionOptions)

    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }  
    exit 0
catch
{ 
   Write-Host "Error: $($_.Exception.Message)"    
    exit 1
}

        #restore database
        $Program = Get-Process SSMS -erroraction SilentlyContinue
        if ($Program)
        {
        $Program.closeMainWindow()
        Sleep 5
        If (!$Program.hasexited)
        {
        $program | stop-process -force
        }
        }
        remove-variable Program
        $FileNam = Get-ChildItem -path $localpath

        Restore-SqlDatabase -ServerInstance "machine\instance" -Database "Test" -BackupFile $FileName -ReplaceDatabase

1 个答案:

答案 0 :(得分:0)

答案已解决/找到。将还原移动到“尝试”部分即可解决该问题,即使它在连接处置之后也是如此。很有可能与退出0有关。另一种解决方案是完全删除try / catch和退出代码。