Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如果SQL数据库不存在,请还原该数据库_Powershell - Fatal编程技术网

Powershell 如果SQL数据库不存在,请还原该数据库

Powershell 如果SQL数据库不存在,请还原该数据库,powershell,Powershell,我正在尝试通过PowerShell将bak文件还原到我的SQL Server实例 在将其放入脚本之前,我试图从PowerShell提示符执行命令 cmd.exe /C SqlCmd -E -S COMPUTER01 -Q "RESTORE DATABASE TestDB FROM DISK = N'.\TestDB.bak' WITH FILE = 1, MOVE N'TESTING' TO N'.\DataStore\TestDB.mdf', MOVE N'TESTING_log' TO N

我正在尝试通过PowerShell将bak文件还原到我的SQL Server实例

在将其放入脚本之前,我试图从PowerShell提示符执行命令

 cmd.exe /C SqlCmd -E -S COMPUTER01 -Q "RESTORE DATABASE TestDB FROM DISK = N'.\TestDB.bak' WITH FILE = 1, MOVE N'TESTING' TO N'.\DataStore\TestDB.mdf', MOVE N'TESTING_log' TO N'.\LogStore\TestDB.ldf', NOUNLOAD, STATS = 5"
它抛出了一个错误

关键字“with”附近的语法不正确。如果此语句是公共表表达式、xmlnamespaces子句或更改跟踪上下文子句,则前一条语句必须以分号终止

然后我将cmd改为添加分号

cmd.exe /C SqlCmd -E -S COMPUTER01 -Q "RESTORE DATABASE TestDB FROM DISK = N'.\TestDB.bak'**;** WITH FILE = 1, MOVE N'TESTING' TO N'.\DataStore\TestDB.mdf', MOVE N'TESTING_log' TO N'.\LogStore\TestDB.ldf', NOUNLOAD, STATS = 5"
现在,它抛出错误:

附近的语法不正确

有人能给我一个工件代码吗

检查名称为TestDB的数据库是否已存在 如果存在,请删除数据库 恢复名为TestDB的TestDB.bak
我在PowerShell 5中使用此脚本,不需要仅使用cmd.exe/C SqlCmd。如果有更好的方法,那么我也会调整它。

这将满足您的要求,但它不会询问您是否存在数据库。这需要更多的代码行,这真的很重要,因为您将以任何方式删除DB \重写它

$DBName="TestDB"
$backupFilePath="D:\TESTDB.bak"
$Datafilepath="D:\DataStore" #Do not add the trailing \
$Logfilepath="D:\LogStore" #Do not add the trailing \
$dbCommand = "use [master];RESTORE DATABASE [$DBName] " + "FROM DISK = N'$backupFilePath'" + "WITH FILE = 1, NOUNLOAD, STATS = 10, " + "move 'TESTING' to '$Datafilepath" + "\" + "$DBName" + "_data1.mdf', " + "move 'TESTING_log' to '$Logfilepath" + "\" + "$DBName" + "_log1.ldf';" + "alter database [$DBName] modify file (name=N'TESTING', newname=N'$DBName" + "_data1');" + "alter database [$DBName] modify file (name=N'TESTING_log', newname=N'$DBName" + "_log1');" + "alter database [$DBName] set read_committed_snapshot on with rollback immediate;" + "alter database [$DBName] set COMPATIBILITY_LEVEL = 100;"
sqlcmd -S $DBServerName -E -Q $dbCommand -r0

你认为你为什么需要cmd/c?当您删除它时会发生什么?另外,您的问题是PowerShell v5,而您的标记是PowerShell v3。是哪一个?我编辑了标签以删除powershell 3.0。很抱歉,标签错了。顺便说一句,我在SO的其他解决方案中看到了cmd.exe/C语法。例如,我认为这就是我们从powershell执行sqlcmds的方式。您正在从磁盘还原,并且您正在指定NonLoad,这似乎不正确。powershell可以自行运行外部命令。cmd/c仅在某些罕见的情况下或当您想要使用cmd内置命令时才需要。