Alright I’ve got this portion working now by combining a couple of other scripts. I now need to figure out how to fix all of the orphaned users after the DB restores are complete.
I call everything using:
sqlps.exe -executionpolicy bypass -File D:\Scripts\SQLRestores.ps1 -BackupFileLocation D:\RestorefromDenver\Extracted -SqlServerName na-alb-prdsql1
The current script is:
Param (
[string]$BackupFileLocation,
[string]$SqlServerName
)########### Extract GZ files containing SQL BAK files #################################################
$shell=new-object -com shell.application
$CurrentLocation=get-location
$CurrentPath=$CurrentLocation.path
$Location=$shell.namespace($CurrentPath)
$ZipFiles = Get-ChildItem D:\RestorefromDenver\Extracted -Recurse -Include *.gz
$ZipFiles.count | out-default
foreach ($ZipFile in $ZipFiles)
{
C:\7z.exe e -y -oD:\RestorefromDenver\Extracted $ZipFile.Name
}########### Setup for BAK file restores #################################################
$server = New-Object (“Microsoft.SqlServer.Management.Smo.Server”) $SqlServerName
$DatabaseDefaultPath= $server.MasterDBPath +”\”$bakFiles = Get-ChildItem $BackupFileLocation -Filter “*.bak”
### BOS Get the Default File Locations ###
$DefaultSystemDataLocation = $Server.Information.MasterDBPath
$DefaultSystemLogLocation = $Server.Information.MasterDBLogPath$DefaultUserDBDataLocation = $Server.Settings.DefaultFile
$DefaultUserDBLogLocation = $Server.Settings.DefaultLogif ($DefaultUserDBDataLocation.Length -eq 0)
{
$DefaultUserDBDataLocation = $DefaultSystemDataLocation
}
if ($DefaultUserDBLogLocation.Length -eq 0)
{
$DefaultUserDBLogLocation = $DefaultSystemLogLocation
}### EOS Get the Default File Locations ###
###### BEGIN OF FOR LOOP ##############################################################################
foreach ($bak in $bakFiles)
{$RestoreHeaderOnlyQuery=”Restore HeaderOnly From Disk=N’”+$bak.FullName+”‘”
$HeaderData=INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $RestoreHeaderOnlyQuery$FileNumber=0
foreach ($HData in $HeaderData)
{
If($HData.BackupType -eq 1)
{
$FileNumber=$HData.Position
$DBName=$HData.DatabaseName
$BackupOfServer= “["+$HData.ServerName+"]”
}
}if ($FileNumber -ne 0)
{IF($DBName -eq “master” -OR $DBName -eq “model” -OR $DBName -eq “msdb”)
{
$DefaultDataLocation=$DefaultSystemDataLocation+ “\”
$DefaultLogLocation=$DefaultSystemLogLocation+ “\”
}
else
{
$DefaultDataLocation=$DefaultUserDBDataLocation+ “\”
$DefaultLogLocation=$DefaultUserDBLogLocation+ “\”
}$db = $server.Databases[$DBName]
write-host “————————————————————-”
write-host “Restoring database [$($dbName)] On Server $($server)” -ForegroundColor Green
write-host “————————————————————-”$RestoreFileListQuery=”Restore FilelistOnly From Disk=N’”+$bak.FullName+”‘”
$FileListData=INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $RestoreFileListQuery
$MoveQuery=”"foreach ($FData in $FileListData)
{$PhName=$FData.PhysicalName
$str= $PhName.SubString(0,$PhName.LastIndexOf(“\”)+1)
$PhName=$PhName -replace “\\”,”_”
$str=$str -replace “\\”,”_”
$LogicalFilename= $PhName -replace $str,”"IF($FData.Type -eq “D”)
{
$MoveQuery=$MoveQuery+
“MOVE N’”+$FData.LogicalName+”‘”+
“TO N’”+$DefaultDataLocation+ $LogicalFilename+”‘,”
}IF($FData.Type -eq “L”)
{
$MoveQuery=$MoveQuery+
“MOVE N’”+$FData.LogicalName+”‘”+
“TO N’”+$DefaultLogLocation+ $LogicalFilename+”‘,”
}
}$RestoreQuery= “Restore Database “+ $DBName +
” FROM DISK=N’”+$bak.FullName+”‘ “+
“WITH REPLACE,FILE = “+ $FileNumber+”,”+
$MoveQuery +
“NOUNLOAD, STATS = 20″if ($DBName -eq “master”)
{if($BackupOfServer -eq $server)
{
$QrForInstance=”select isnull(‘mssql?’+cast(SERVERPROPERTY(‘instancename’) as varchar(50)),’mssqlserver’) as InstanceName”
$Instance=INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $QrForInstance -VERBOSE
$ServiceName=$Instance.InstanceName
$DisplayName= Get-Service -name $ServiceName | select DisplayName
$Command=”net start""+$DisplayName.DisplayName+"
” /m”If($ServiceName -like “*sql*” -and $DisplayName -like “*sql*”)
{
#Stop Service
stop-service $ServiceName -force -verbose#Start Service in Single User Mode
invoke-EXPRESSION $Command -verbose#Restoring Master Database
write-host “********************”
INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $RestoreQuery -querytimeout 65534 -VERBOSE
write-host “********************”
write-host “”#Stop Service
stop-service $ServiceName -force -verbose#Start Service
start-service $ServiceName -verbose}
}
else
{
write-host “You are restoring The backup of master database of server $($BackupOfServer) to Server $($server), which is not compatiable.” -ForegroundColor Red
write-host “Please restore valid backup.” -ForegroundColor Red}
}
else
{
if ($db -ne $null)
{
$server.KillAllProcesses($dbName)
}INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $RestoreQuery -querytimeout 65534 -VERBOSE
}write-host “————————————————————-”
write-host “”}
ELSE
{
write-host “———————————————————————————————————–”
write-host “Backup file $($bak.FullName) does not contain any FULL database backup(s)” -ForegroundColor Red
write-host “———————————————————————————————————–”
write-host “”}
Start-Sleep -Seconds 3}
###### END OF FOR LOOP ##############################################################################
write-host “”