2013-11-15 9 views
0

원격 서버의 모든 데이터베이스를 백업하는 스크립트를 만들었습니다. PowerShell ISE 인터페이스에서 스크립트를 실행할 때 백업 장치에서 결정한 경로가 제대로 작동하지만 프롬프트에서 실행하면 설정된 경로가 무시되고 SQL Server의 기본 백업 디렉터리로 백업됩니다 . 왜 그런가요? 어떻게 고칠 수 있습니까? 다음은 내 스크립트입니다 : 그냥 ISE에서 실행하면프롬프트에서 powershell 스크립트를 실행할 때 SQL Server 2008에서 백업 장치 경로를 사용하지 않습니다.

$DestSqlTpb = "E:\BackupBD\SQL-TPB-01\"; 
$PastaRede = "\\sql-tpb1-01\BackupBD\SQL-TPB-01\"; 
Write-Output ("Started DELETE at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));  
$ComandoDeleteRede = $PastaRede + "*" 
remove-item $ComandoDeleteRede 
$ComandoSqlTpbLocal = $DestSqlTpb + "*" 
remove-item $ComandoSqlTpbLocal 
Write-Output ("Finished DELETE at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));  
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.ConnectionInfo');    
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Management.Sdk.Sfc');    
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO'); 
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMOExtended'); 
$Server = "SQL-TPB1-01\SQL2008";  # SQL Server Instance.  
$srv = new-object ("Microsoft.SqlServer.Management.Smo.Server") $Server 

Write-Output ("Started SQL-TPB1-01 at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss)); 
$dbs = $srv.Databases 
foreach ($db in $dbs) 
{ 
    if (($db.Name -ne "tempdb") -and (!$db.IsDatabaseSnapshot)) #We don't want to backup the tempdb database 
    { 
    $timestamp = Get-Date -format yyyy-MM-dd-HH-mm-ss; 
    $backup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup");    
    $backup.Action = "Database";    
    $backup.Database = $db.Name;    
    $backup.Devices.AddDevice($Dest + $db.Name + "_full_" + $timestamp + ".bak", "File");    
    $backup.BackupSetDescription = "Full backup of " + $db.Name + " " + $timestamp;    
    $backup.Incremental = 0;  
    $backup.CompressionOption = 1; 
    # Starting full backup process.    
    $backup.SqlBackup($srv);  
    # For db with recovery mode <> simple: Log backup.    
    If ($db.RecoveryModel -ne 3)    
    {    
     $timestamp = Get-Date -format yyyy-MM-dd-HH-mm-ss;    
     $backup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup");    
     $backup.Action = "Log";    
     $backup.Database = $db.Name;    
     $backup.Devices.AddDevice($Dest + $db.Name + "_log_" + $timestamp + ".trn", "File");    
     $backup.BackupSetDescription = "Log backup of " + $db.Name + " " + $timestamp;    
     #Specify that the log must be truncated after the backup is complete.    
     $backup.LogTruncation = "Truncate"; 
     # Starting log backup process    
     $backup.SqlBackup($srv);  
    }; 
    }; 
}; 
Write-Output ("Finished SQL-TPB1-01 at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss)); 
Write-Output ("Started COPY at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));  
copy-item $ComandoDeleteRede $DestSqlTpb 
Write-Output ("Finished COPY at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));  

, 그것은 잘 간다,하지만 난 PS1 파일을 저장하고 프롬프트에서 실행하면, 장치의 경로는 무시됩니다. TKS

+0

최종 및 전체 소스 코드 스크립트가 작동합니까? – Kiquenet

답변

1

내가 문제를 장담이 라인이다 : 당신은 당신의 스크립트에서 아무 곳이나 정의되지 않은 $ 신지 변수를 사용하는

$backup.Devices.AddDevice($Dest + $db.Name + "_full_" + $timestamp + ".bak", "File"); 

. $ Dest 변수를 ISE 세션에서 원하는 경로로 설정 했으므로 거기에서 작동합니다.

하지만 새 콘솔 창에서 SQL이 기본 경로를 사용하도록 $ Dest가 null입니다.