Очистка папки ROOT\SND программы Djin

Материал из rrv-wiki
Перейти к навигации Перейти к поиску
# ===Скрипт используестся для обслуживания файловой базы программы 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
  }
}