我有一个文件夹,其中包含多个数据库的一堆 SQL Server .BAK 文件。 .BAK 文件名每天都在变化。
其中,我只对 3-4 个数据库的 最新 BAK 文件感兴趣
Restore-SqlDatabase
。
这是我到目前为止所拥有的:
$databases = @('Orders', 'Items', 'Returns')
$BackupPath = '\\BACKUPSERVER\BackupData\'
$latestBackupFile = Get-ChildItem $BackupPath -Attributes !Directory *$databases[0]* | Sort-Object -Descending -Property LastWriteTime | Select-Object -First 1
$latestBackupFile
#Restore-SqlDatabase -ServerInstance "my-vm" -Database "Orders" -BackupFile "\\BACKUPSERVER\BackupData\AODA2.Orders.2024-01-15.22-23-13.BAK" -ReplaceDatabase
#Restore-SqlDatabase -ServerInstance "my-vm" -Database "Orders" -BackupFile "\\BACKUPSERVER\BackupData\MMMWW.Items.2024-01-15.22-23-13.BAK" -ReplaceDatabase
Restore-SqlDatabase
命令单独执行时有效;我已将上下文包含在上述脚本中。
*$databases[0]*
- 这不会产生像我希望的那样的通配符字符串*Orders*
。
我不知道如何为 a) 循环遍历
$databases
数组以获取通配符字符串,如 *Orders*
、*Items*
、*Returns*
等
和
b) 循环遍历每个通配符的最新 .BAK 文件以构建 Restore-SqlDatabase
命令。
我是 PowerShell 新手;这个怎么做?谢谢你。
PowerShell 有两种不同的语法,在文档中描述为“解析模式”:
*$database[0]*
参数当 PowerShell 在参数模式下遇到所谓的“裸字标记”时,它会自动将其解释为可扩展字符串文字表达式的内容。
换句话说,参数
*$databases[0]*
的解释与您编写的 "*$databases[0]*"
相同。
在可扩展字符串文字中,仅识别和扩展简单变量表达式 - 因此 PowerShell 尝试自行计算
$databases
,而不考虑 [0]
。
您可以通过使用子表达式运算符包装表达式来转义字符串插值规则
$()
:
"*$($databases[0])*"
很高兴知道,但你在这里并不真正需要它 - 你需要一个循环!
我不知道如何制作 ForEach 循环
PowerShell 中的
foreach
循环语句相当简单:
foreach ($item in $collection) {
# work with each $item here
}
让我们用您的
$databases
数组尝试一下:
foreach ($databaseName in $databases) {
# find the latest backup file containing the db name in its file name
$latestBackupFile = Get-ChildItem $BackupPath -File -Filter "*$databaseName*.bak" | Sort-Object -Descending -Property LastWriteTime | Select-Object -First 1
if ($latestBackupFile) {
Restore-SqlDatabase -ServerInstance "my-vm" -Database $databaseName -BackupFile $latestBackupFile.FullName -ReplaceDatabase
}
else {
Write-Warning "Unable to locate backup file for database $databaseName"
}
}