使用凭据打破脚本块

问题描述

概述:这是一个 PowerShell 脚本,用于自动执行 SQL 数据库备份,必须尽可能并行完成。

这很好用。

$ServerInstanceSource = ".\INSTANCE01"
$ServerInstanceDestination = ".\INSTANCE02"
$UserName = 'user'
$PassWord = 'pass'

$GetDBs = Invoke-Sqlcmd -ServerInstance $ServerInstanceSource -Username $UserName -Password $Password -Database tempdb -Query "SELECT name FROM sys.databases WHERE database_id > 4 AND recovery_model_desc != 'SIMPLE'"
$Date =  (Get-Date -Format 'yyyyMMddhhmmss')
$BackupSourceDirectory = 'F:\DB-BACKUP\SQLBACKUP\Manual Logshipping Restoration\'
$BackupDestinationDirectory = 'D:\BACKUPS\'

Get-Job | Remove-Job -Force

Write-Output "Creating FULL backup. . ."

ForEach($db in $GetDBs.name){
    $FileName = "FULL-$db-$Date.bak"
    $FullBackupPath = Join-Path -Path $BackupSourceDirectory -ChildPath $FileName
    $BackupFullScript = "BACKUP DATABASE $db TO DISK = N'$FullBackupPath' WITH NOFORMAT,NOINIT,NAME = N'$db-FULL Database Backup',SKIP,NOREWIND,NOUNLOAD,COMPRESSION,STATS = 10"
    $SQLBackupFull = "Invoke-Sqlcmd -ServerInstance $ServerInstanceSource -Username $UserName -Password $Password -Database tempdb -Query `"$BackupFullScript`" -QueryTimeout 21600;" # 5 hours
    [scriptblock]$cmdblock1 = [ScriptBlock]::Create($SQLBackupFull)
    Start-Job $cmdblock1
}

Get-Job | Wait-Job
Get-Job | Receive-Job

但是,当我将代码转换为接受凭据而不是硬编码的凭据时,出现错误:

$ServerInstanceSource = ".\INSTANCE01"
$ServerInstanceDestination = ".\INSTANCE02"
$Cred = Get-Credential

$GetDBs = Invoke-Sqlcmd -ServerInstance $ServerInstanceSource -Credential $Cred -Database tempdb -Query "SELECT name FROM sys.databases WHERE database_id > 4 AND recovery_model_desc != 'SIMPLE' -- Dynamic; Input specific databases only,if necessary."
$Date =  (Get-Date -Format 'yyyyMMddhhmmss')
$BackupSourceDirectory = 'C:\Users\edgar.bayron\Music\Edgar\Trash Can\DB-BACKUP\SQLBACKUP\LAX-DBMON\' # "F:\DB-BACKUP\SQLBACKUP\Manual Logshipping Restoration\"
$BackupDestinationDirectory = 'C:\Users\edgar.bayron\Music\Edgar\Trash Can\DB-BACKUP\SQLBACKUP\DAL-INDBS01\' # "D:\BACKUPS\"

Get-Job | Remove-Job -Force

Write-Output "Creating FULL backup. . ."

ForEach($db in $GetDBs.name){
    $FileName = "FULL-$db-$Date.bak"
    $FullBackupPath = Join-Path -Path $BackupSourceDirectory -ChildPath $FileName
    $BackupFullScript = "BACKUP DATABASE $db TO DISK = N'$FullBackupPath' WITH NOFORMAT,STATS = 10"
    $SQLBackupFull = "Invoke-Sqlcmd -ServerInstance $ServerInstanceSource -Credential $Cred -Database tempdb -Query `"$BackupFullScript`" -QueryTimeout 21600;" # 5 hours
    [scriptblock]$cmdblock1 = [ScriptBlock]::Create($SQLBackupFull)
    Start-Job $cmdblock1
}

Get-Job | Wait-Job
Get-Job | Receive-Job

错误:

Wait-Job : The Wait-Job cmdlet cannot finish working,because one or more jobs are blocked waiting for user interaction.  Process interactive job 
output by using the Receive-Job cmdlet,and then try again.

我正在尝试应用推荐的 here,但我无法完全应用它,因为在示例中,它只有一个参数,而我有多个参数。如果我尝试应用它,它会搜索其他变量。

我尝试使用 {PARAM($ServerInstanceSource,$cred,$BackupFullScript),但它破坏了 $BackupFullScript 内的 SQL 查询。

有人可以帮我吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)