SQL Server 2008 n'utilise pas le chemin du périphérique de sauvegarde lors de l'exécution d'un script PowerShell à partir de l'invite
-
20-12-2019 - |
Question
J'ai fait un script qui sauvegarde toutes les bases de données de mon serveur distant.Lorsque j'exécute le script à partir de l'interface PowerShell Ise, le chemin que je déterminerai dans le périphérique de sauvegarde fonctionne bien, mais lorsque je l'exécute à l'invite, le chemin I Set est ignoré et la sauvegarde est effectuée sur le répertoire de sauvegarde par défaut de SQL Server..Pourquoi est-ce que cela, et comment puis-je le réparer? Vous trouverez ci-dessous mon script:
$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));
Quand je viens de courir d'Ise, il se passe bien, mais si je sauvegardez le fichier PS1 et exécutez de l'invite, le chemin dans l'appareil est ignoré.Tks
La solution
Je parie que le problème est avec cette ligne:
$backup.Devices.AddDevice($Dest + $db.Name + "_full_" + $timestamp + ".bak", "File");
Vous utilisez la variable $ Dest, qui n'est définie nulle part dans votre script.Je parie que vous avez la variable $ Devt définie sur le chemin de votre choix dans la session ISE, c'est pourquoi cela fonctionne là-bas.
Mais dans une nouvelle fenêtre de console, $ DESTS est NULL SO SQL utilise le chemin par défaut.