有一个powershell脚本,它从一个目录中选择最后一个文件(即数据库备份),将其复制到本地磁盘(因为备份在网络上的另一台机器上)并将备份恢复到测试数据库。一切正常,但有一点,如果备份以外的文件以某种方式进入源文件夹并且结果是最后一个,则脚本会获取并复制它。一般来说,一切都是合乎逻辑的,我想要我得到什么,但我希望脚本只在备份中选择最后一个,即带有 *.bak 扩展名的文件。这是脚本本身的一个示例。
[CmdletBinding()]
Param([string] [Parameter(Mandatory=$true)] $SqlServer=$null, # SQL Сервер для которого будет исполняться скрипт
[Parameter(Mandatory=$true)] $SqlBaseConnect=$null, # База данных к которой будем подклюдчаться
[Parameter(Mandatory=$true)] $SqlBaseRestore=$null, # База данных для которой будет исполняться скрипт
[Parameter(Mandatory=$true)] $SqlLogin=$null, # Логин базы данных
[Parameter(Mandatory=$true)] $SqlPassw=$null, # Пароль базы данных
[Parameter(Mandatory=$true)] $destination=$null, # Каталог назначения
[Parameter(Mandatory=$true)] $DiskSource=$null, # Диск источника
[Parameter(Mandatory=$true)] $CatalogSource=$null) # Каталог источника
#Запуск таймера
$watch = [System.Diagnostics.Stopwatch]::StartNew()
$watch.Start()
#Лог скрипта
$LogF="RestoreBackupLog.txt"
if (Test-Path $LogF) {Clear-Content $LogF}
Add-Content -Path $LogF -Value "Starting ..."
# Переприсваиваем переменную источника к виду Путь источника
$Source=$DiskSource+$CatalogSource
# Проверяем существует ли источник
$TestPasth = Test-Path $Source
if ($TestPasth -eq "True") {
# Выбираем самый новый файл на источнике.
$FileCopy = Get-ChildItem -Path $Source -ErrorAction SilentlyContinue -ErrorVariable ErrVarFile | Sort-Object LastWriteTime | Select-Object -Last 1
}
else {Write-Host Указаный путь не существует
exit}
# Копируем выбраный фаил
Copy-Item -Path "$Source\$FileCopy" -Destination "$destination" -Force -ErrorAction SilentlyContinue -ErrorVariable ErrVar | Out-Null
$ErrVarStd=$?
Add-Content -Path $LogF -Value $ErrVar
# Проверяем скопировался ли фаил, если да то запускам востановлние базы
if ($ErrVarStd -eq "True") {
#Подключение к SQL и выполнение запроса
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$SqlServer; Database=$SqlBaseConnect; User ID=$SqlLogin; Password=$SqlPassw;"
$SqlConnection.Open()
$SqlCmd = $SqlConnection.CreateCommand()
$SqlCmd.CommandText = "Restore database [$SqlBaseRestore]
FROM DISK = '$destination\$FileCopy'"
$objReader = $SqlCmd.ExecuteReader()
while ($objReader.read()) {
Write-Output $objReader.GetValue(0)
}
$objReader.close()
# Удаляем фаил бэкапа из каталога назначения после востановления
Remove-Item $destination\$FileCopy
}
else {Write-Host Не удалось скопировать фаил бэкапа
exit }
#Остановка таймера
$watch.Stop()
$elapsedtime=$watch.Elapsed
Write-Host Время выполнения $elapsedtime
Add-Content -Path $LogF -Value "Время выполнения $elapsedtime"
如果将行更改为
$FileCopy = Get-ChildItem -Path $Source -Include *.bak -ErrorAction SilentlyContinue -ErrorVariable ErrVarFile | Sort-Object LastWriteTime | Select-Object -Last 1
然后脚本停止工作,因为 $FileCopy 变量采用文件完整路径的形式,但即使您替换了该行
Copy-Item -Path "$Source\$FileCopy"
在
Copy-Item -Path "$FileCopy"
目标处的脚本会创建一个文件夹而不是文件,因此在没有找到文件的情况下会失败。告诉我如何从目标目录中选择备份文件。