1

长期潜伏者,第一次海报。我希望这里有人可以帮我解决一个让我难过的问题。本质上,我正在尝试编写一个 Powershell 脚本,它将多部分 SQL Server 数据库恢复到远程服务器。我已经弄乱了invoke-commandscript-block功能,以至于我了解如何使用变量和参数......但是我注意到一些非常有趣的行为。

这是我现在的代码:

cls
$strbaktest = "S:\Landing\testdb1.bak,S:\Landing\testdb2.bak"
echo "The backup files are $strbaktest"
write-host
$StrScrBlk = {param($StrBaktest);  &Restore-SqlDatabase -ServerInstance "mydbserver" -Database     testdb -BackupFile $strbaktest -ReplaceDatabase}
invoke-command -ComputerName mydbserver -ScriptBlock $StrScrBlk -argumentlist $strbaktest

这会产生如下错误:

System.Data.SqlClient.SqlError: 无法打开备份设备“S:\Landing\testdb1.bak,S:\Landing\testdb2.bak”。操作系统错误 123(文件名、目录名或卷标语法不正确。)。

但是,如果我将相同的路径硬编码到我的脚本块中,它可以工作:

cls
$StrScrBlk = {Restore-SqlDatabase -ServerInstance "mydbserver" -Database testdb -BackupFile S:\Landing\testdb1.bak,S:\Landing\testdb2.bak -ReplaceDatabase}
invoke-command -ComputerName mydbserver -ScriptBlock $StrScrBlk

我注意到的另一件有趣的事情是,如果我只有一个文件要恢复,使用第一种方法和变量可以工作:

cls
$strbaktest = "S:\Landing\testdb.bak"
echo "The backup files are $strbaktest"
write-host
$StrScrBlk = {param($StrBaktest);  &Restore-SqlDatabase -ServerInstance "mydbserver" -Database     testdb -BackupFile $strbaktest -ReplaceDatabase}
invoke-command -ComputerName mydbserver -ScriptBlock $StrScrBlk -argumentlist $strbaktest

希望这对某人有意义。我花了几个小时尝试了很多不同的方法来让它工作——但我似乎无法弄清楚。任何帮助或建议表示赞赏。

谢谢!

4

1 回答 1

0

逗号是分隔数组元素的运算符或标识符。相比:

PS C:\> 1,2
1
2
PS C:\> "1,2"
1,2
PS C:\>

尝试这个:

$strbaktest = "S:\Landing\testdb1.bak","S:\Landing\testdb2.bak"

它与 "x","c" 一起工作。逗号不是必需的,因为它正在等待一个数组。

于 2014-11-18T19:41:47.050 回答