K
K
k4nt2022-04-14 12:30:28
PowerShell
k4nt, 2022-04-14 12:30:28

PS: out-file leaves 2 entries. Why?

There is a mini script for dragging files back and forth every N time.

# Копирование файлов из папки bl для дальнейшей синхронизации
    # Принцип работы:
    # Из целевой папки берутся файлы по шаблону.
    # Так как файлов много с разными названиями - берётся по маске даты, времени и общих символов.
    # Это позволит при добавлении файлов с иным началом копировать их без вмешательства в скрипт.
    # После собираются данные о количестве файлов в источнике и целевой папке в отдельный файл.
  #

# Папка откуда копируются файлы
$copyFrom = "E:\bl\"
# Папка куда скопировать файлы
$copyTo = "\\bl_x\c\bl\" + (Get-Date -format yyyy-MM-dd-HH-mm)

# Сохраняем время для создания отчёта сейчас
  # Так как копирование происходит с задержкой- нужно сохранить время заранее. Оно используется в маске поиска.
$mask = "*" + (Get-Date -format yyyy-MM-dd-HH-mm) + "*"

  # Собираем шаблон удаляемого каталога N дней назад. 
    # Для изменения нужно заменить числов в AddDays(-1). Сейчас хранится 1 день.
  #$delFolder = $copyTo + (Get-Date).AddDays(-1).ToString('yyyy-MM-dd-HH-mm')

# Файлы создаются с 8:00 до 23:00
# Проверяем время что бы не делать лишних пустых папок
# Время больше 7 часов
if ((Get-Date).Hour -gt 7)
{
  # Время меньше 23 часов
  if ((Get-Date).Hour -le 23)
  {
    # Создаём папку для новых файлов с датой и временем
    New-Item -Path $copyTo -ItemType Directory

    # Собираем шаблон названия файла
      # Любое начало + _log_ 
      # + Год
      # + Месяц
      # + День
      # + час + любые символы
    $file = $copyFrom + "*_log_" + (Get-Date -format yyyy-MM-dd-HH-mm) + "*"

    # Ждём некоторое время, что бы все файлы успели создаться.
    sleep -s 300

    # Копирование файлов в целевую папку.
    Copy-Item -Path $file -Destination $copyTo
    
    # Удаление устаревших файлов
    #Remove-Item -Path $delFolder -Recurse
  }
  else
  {
    # Время 23 часа, но меньше 15 минут. Последние файлв в 23:00
    if (((Get-Date).Hour -eq 23) -and ((Get-Date).Minute -lt 15))
    {
          New-Item -Path $copyTo -ItemType Directory
          $file = $copyFrom + "*_log_" + (Get-Date -format yyyy-MM-dd-HH-mm) + "*"
          sleep -s 300
          Copy-Item -Path $file -Destination $copyTo
          #Remove-Item -Path $delFolder -Recurse
    }
  }
}

sleep -s 30

# Создание отчёта о скопированных файлах.
  # Считаем количество переданых файлов
$fileInGWD = (Get-ChildItem $copyTo -Filter $mask).Count
  # Считаем количество исходных файлов
$fileInMistral2 = (Get-ChildItem $copyFrom -Filter $mask).Count
  # Создание отчёта о переданых файлах
$report = (Get-Date -format yyyy-MM-dd-HH-mm) + ": Передано " + $fileInGWD + " из " + $fileInMistral2 + " файлов."
  # Указываем путь до файла с отчётами
$reportFile = "\\bl_x\c\bl\" + (Get-Date -format yyyy-MM-dd) + ".txt"
  # Передаём отчёт в файл
$report | out-file -filepath $reportFile -append -width 200


For some reason, during the script (If works) "$report | out-file -filepath $reportFile -append -width 200" leaves 2 records: one when not everything has been transferred yet, the second when everything has been transferred. When if does not fulfill - only one.

What I want: I want always 1 entry. Who knows what is the reason and where to dig?

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question