Очистка папки ROOT\SND программы Djin
Перейти к навигации
Перейти к поиску
# ===Скрипт используестся для обслуживания файловой базы программы Djin===
# ===создает структуру папок root\snd_old аналогичную root\snd и переносит туда файлы которых нет в базе===
# ===Внимание!!!! Если файл стоит только в расписании или в шаблоне, но его нет в базе, файл будет перенесен!!!===
# Максимальное количество переносимых файлов (за один запуск скрипта)
$maxNumOfMovfiles = 10000
# ========= Подготовка переменных ===============
# Папка откуда будут удалятся файлы
$sndDir = '\\nvb\DFS\TRACT\Root\SND'
# Папка куда будут переносится файлы
$sndDirOld = '\\nvb\DFS\TRACT\Root\SND_old'
# Делаем все символы строчными
$sndDir = $sndDir.ToLower()
$sndDirOld = $sndDirOld.ToLower()
# ===============Список файлов ROOT\SND=====================
$djinFileBase = (Get-Childitem -Path "\\nvb\dfs\tract\root\snd\" -Recurse -File | Select-Object -ExpandProperty FullName).ToLower()
# =======================================
# ===========================Список элементов базы=======
# Подключение к базе
$SqlServer = "NVB-DCSRV-01\DS2SQLEXPRESS";
$SqlCatalog = "nvb-ds2";
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$SqlServer; Database=$SqlCatalog; Integrated Security=True"
$SqlConnection.Open()
# Выполнение запроса
$SqlCmd = $SqlConnection.CreateCommand()
$SqlCmd.CommandText = "SELECT [FileName] FROM [NVB-DS2].[dbo].[PH]"
$objReader = $SqlCmd.ExecuteReader()
# Создаем пустой массив для хранения списка файлов (с частью пути) из базы
$djinSqlBase = @()
while ($objReader.read()) {
# $djinSqlBase += $objReader.GetValue(0).toString().Trim().ToLower().Replace('\\nvb\dfs\tract\root\snd\',)
$djinSqlBase += $objReader.GetValue(0).toString().Trim().ToLower()
}
$objReader.close()
# Закрытие подключения к базе
$SqlConnection.close()
#========================================
# ==============Сравнение Списков============================
# ==============Есть в файловой системе, нет в базе=========
# Текущее количество перенесенных файлов
$numOfMovfiles = 0
# Перебираем все файлы найденные в директории
foreach ($fileTemp in $djinFileBase){
# Выставляем флаг Файл не найден
$flagSearch = $false
# Вычисляем расширение файла и делаем его строчными
$fileExt = [System.IO.Path]::GetExtension($fileTemp).ToLower()
# Обрабатываем только известные расширения файлов
if (($fileExt -eq '.wav') -or ($fileExt -eq '.mp2') -or ($fileExt -eq '.mp3')){
# Перебираем все файлы из базы
foreach ($sqlNameTemp in $djinSqlBase){
# Если совпадение найдено, то выставляем флаг Файл найден
if ($fileTemp -eq $sqlNameTemp){
$flagSearch = $true
}
}
# Если файл был найден (Флаг в True) то переносим файл
if ((!$flagSearch) -and ($fileTemp -ne "")) {
# Получаем путь до папки куда будем копировать файл (если в конце нет '\' добавляем)
$pathOld = ([System.IO.Path]::GetDirectoryName($fileTemp)).TrimEnd('\') + '\'
# Получаем имя файла
$file = [System.IO.Path]::GetFileName($fileTemp)
# Проверяем на то, что переносимый файл находится в нужной папке
if ($pathOld.StartsWith($sndDir)){
# Создаем путь для переноса файла
$pathNew = $pathOld.Replace($sndDir,$sndDirOld)
# Получаем полное имя файла в новой директории (целевой файл)
$pathNewFile = $pathNew + $file
# Создаем новую директорию (если она не существует)
If(!(test-path $pathNew))
{
New-Item -ItemType Directory -Force -Path $pathNew | Out-Null
}
# Проверяем количество перенесенных файлов и если лимит превышен останавливаем скрипт
if ($maxNumOfMovfiles -lt $numOfMovfiles){
echo "Лимит в $maxNumOfMovfiles перенесенных файлов превышен останавливаем скрипт"
exit
}
# Переносим файл в новое место
[System.IO.File]::Move($fileTemp, $pathNewFile)
echo "Move($fileTemp, $pathNewFile)"
# Сохраняем в лог
echo $fileTemp >> "C:\Distrib\DjinSQLmoveOldFileLog.txt"
# Увеличиваем количество перенесенных файлов
$numOfMovfiles += 1
} else {
echo "Ошибка! Файл не в заданной директории $sndDir :"$fileTemp
}
}
} else {
echo "Ошибка! Не правильное расширение: $fileTemp"
Start-Sleep -s 15
# pause
# exit
}
}
# ==============Есть в базе, нет в файловой системе=========
foreach ($sqlNameTemp in $djinSqlBase){
$flagSearch = $false
foreach ($fileTemp in $djinFileBase){
if ($fileTemp -eq $sqlNameTemp){
$flagSearch = $true
}
}
if ((!$flagSearch) -and ($sqlNameTemp -ne "")) {
echo "No in Filesystem "$sqlNameTemp
}
}