More for me than you. Something I type up all the time and forget where the heck I put it. Not tested, but should give you the general idea.
Import-Module SqlPS -DisableNameChecking $destServers = @('Server1', 'Server2', 'Server3') $srcPath = "\\sharepath\Backups" try{ $destServers | %{ $serverName = $_ $srv = New-Object Microsoft.SqlServer.Management.Smo.Server "$serverName,1433" gci -Path $srcPath | ?{$_.Extension -eq '.bak'} | %{ $dbName = $_.BaseName $backupFile = $_.FullName $backupDevice = New-Object Microsoft.SqlServer.Management.Smo.BackupDeviceItem ($backupFile, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) $restore = New-Object Microsoft.SqlServer.Management.Smo.Restore $restore.Devices.Add($backupDevice); $restore.NoRecovery = $true; $restore.ReplaceDatabase = $true $restore.Database = $dbName $backup = New-Object Microsoft.SqlServer.Management.Smo.BackupDeviceItem ($backupFile, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) $restore = New-Object Microsoft.SqlServer.Management.Smo.Restore $restore.Devices.Add($backup); $dbFiles = $restore.ReadFileList($srv); $moveFiles = @(); foreach($dbFile in $dbFiles){ $fileName = [System.IO.Path]::GetFileName($dbFile.PhysicalName); switch($dbFile.Type){ 'D'{ $moveFiles += New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($dbFile.LogicalName, "E:\MSSQL\Data\$fileName") } 'L'{ $moveFiles += New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($dbFile.LogicalName, "G:\MSSQL\TranLog\$fileName") } } } $srv.ConnectionContext.StatementTimeout = 0; restore-sqldatabase -InputObject $srv -Database $dbName -BackupFile $backupFile -RelocateFile $moveFiles -ReplaceDatabase } } } catch{ $_ | fl -Force }