Я пытаюсь создать механизм (в моем случае Robocopy, завернутый в PowerShell), который будет выполнять резервное копирование журналов IIS со всех наших веб-серверов в центральный общий ресурс CIFS. Как и следовало ожидать, у меня возникли проблемы с копированием открытого в данный момент файла журнала, поскольку NTFS не всегда надежно обновляет LastWriteTime по мере записи файла, если все его дескрипторы не закрыты.
Однако я заметил, что всякий раз, когда я просматривал каталог с помощью проводника Windows, не только обновлялось обновление Date Modified, но и при следующем запуске Robocopy правильно обнаруживалось и обновлялось. Пытаясь имитировать поведение проводника Windows, я запустил следующий код в PowerShell перед вызовом задания Robocopy:
$aryFileList = Get-ChildItem $job.SourcePath
ForEach ($file in $aryFileList) {(New-object System.IO.FileInfo $file).LastWriteTime | Out-Null}
Это сработало для некоторых из моих серверов IIS и всех других моих методов ведения журнала (в основном log4net). Однако на двух моих серверах IIS это не повлияло, даже если они являются той же ОС и версией IIS, что и другие, на которых он отлично работал.
Это возвращает меня к мысли; что именно делает проводник Windows делать когда вы используете его для обновления каталога до такой степени, что он обновляет информацию о дате изменения / LastWriteTime? Что наиболее важно для моих целей, можно ли каким-либо образом вызвать то же самое в PowerShell?