带有通配符字符串数组的 PowerShell Get-ChildItem

问题描述 投票:0回答:1

我有一个文件夹,其中包含多个数据库的一堆 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 wildcard
1个回答
0
投票

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"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.