Копирование файлов между серверами Windows старше 60 минут или старше

Быстрая необходимость: на этапе задания агента SQL я ищу способ скопировать файлы новее, чем 60 минут назад, на другой сервер. Я не хочу повторно копировать файлы старше этого. Итак, копирование, xcopy, robocopy — все это возможности, поскольку это сервер с Windows 2008 или более поздней версии.

Предыстория: я подключаю процесс, в котором на сервере serverA есть папка, в которую приложение ERP сбрасывает плоские текстовые файлы в эту папку. Мне нужно копировать «самые новые файлы» один раз в час на serverB, чтобы другое приложение (пакет SSIS, который запускается каждые 60 минут) могло обрабатывать файл и сохранять данные в SQL Server. Чтобы копировать только «новые файлы», которые появляются, и не копировать ничего, что я уже скопировал (если существует, это не сработает, потому что я удалю скопированный файл после того, как SSIS обработает его), мне нужно в основном скопировать файлы, которые имеют размер всего 60 минут старше или новее и исключить все остальные файлы.

Как бы то ни было, используемый метод будет шагом задания агента SQL, поэтому CmdExec и Powershell разрешены (я новичок в PowerShell, поэтому я склоняюсь к Robocopy).


person Jeff Mergler    schedule 21.06.2018    source источник


Ответы (1)


Мое решение (и мой первый сценарий PowerShell) состояло в том, чтобы использовать командлет PowerShell «Where-Object» для передачи только файлов, которые были старше 60 минут или новее, в «Get-ChildItem», а затем использовать «Copy-Item» в foreach, как показано ниже:

$srcPath = '\\serverA\ERP\Outbox\'
$destPath = 'C:\ERP\FromERP\Inbox\'
# target files where LastWriteTime >= 60 minutes "ago"
$age = (Get-Date).AddMinutes(-60)
#Write-Output "$age"
$newFiles = Get-ChildItem $srcPath | Where-Object { $_.LastWriteTime -ge $age }
#Write-Output "$newFiles"
foreach ($newFile in $newFiles) {
    #Write-Output "Copying $newFile to $destPath"
    Copy-Item $newFile.FullName -Destination "$($destPath)$($newFile)"
}

Некоторые закомментированные строки были предназначены просто для целей отладки, но я оставил их, чтобы помочь понять, что происходит.

Примечание. Я экспериментировал с копированием, xcopy и robocopy, и я думаю, что с некоторым хитрым синтаксисом пакетного языка, который я видел в другом месте на SO, я мог бы заставить их работать (у robocopy есть аргумент MAXAGE, но самое низкое значение — 1 день, что не является гранулированным хватает на несколько минут), но PowerShell действительно казался более простым и элегантным.

Надеюсь, кто-то еще может использовать эту технику.

person Jeff Mergler    schedule 21.06.2018
comment
Обновление: чтобы предотвратить синтаксические ошибки при выполнении этого кода на этапе агента SQL, измените приведенное выше: Copy-Item $newFile.FullName -Destination "$($destPath)$($newFile)" на: Copy-Item $newFile.FullName -Destination "$destPath$newFile" - person Jeff Mergler; 22.06.2018