Файл, выбранный в WindowsExplorer с панелью предварительного просмотра, блокирует файл, поэтому powershell не может выводить данные в этот файл.

У меня есть запланированный скрипт, который выводит кучу HTML-файлов со статическими именами в удаленное место. Я заметил, что если один из этих файлов выбран в проводнике Windows, чтобы его содержимое отображалось на панели предварительного просмотра, то Powershell не может перезаписать этот файл и пропускает его обновление. Это происходит только в том случае, если выходные файлы находятся в удаленном месте. Работает нормально, если файлы локальные. Как заставить PowerShell перезаписать удаленные файлы в этой ситуации? Многие пользователи работают с этими отчетами, и если один из них закроет окно проводника Windows с одним из этих файлов, выделенным на ночь при запуске скрипта, файл не будет обновлен.


person miguello    schedule 10.08.2020    source источник


Ответы (2)


  • Переместите файлы HTML на веб-сервер. Вы полностью решите свою проблему. Установка IIS на сервере Windows — Next, Next, Next. Вы можете оставить ссылку на новое расположение файла (https://....) в старом месте, чтобы пользователи могли легко перейти в новое место. Возможно, эту ссылку можно автоматизировать (не уверен из-за современных стандартов безопасности)
  • Попробуйте [System.IO.File]::Delete($path) непосредственно перед записью этого файла. Это удаляет запись о файле из файловой системы, но оставляет файл открытым для тех, у кого он пока открыт. Это заставляет ваш скрипт писать в новый файл с тем же именем. Старый файл существует без имени (удален), но остается открытым до тех пор, пока все его не закроют. Проверьте, действительно ли он удален с помощью ресреша!
  • Попробуйте [System.IO.File]::Move($path, $someTrashFullName) непосредственно перед записью этого файла. $someTrashFullName, вероятно, должен находиться на том же диске. То же, что и Delete, но переименовывает файл. Некоторое самообновляющееся программное обеспечение использует эту стратегию. Файл переименовывается, но остается открытым под новым именем.
  • Попробуйте заменить файл ярлыком на какой-нибудь файл. Вы можете создавать файлы с разными именами и изменять ярлык программно
  • Файлы HTML, которые изменяют местоположение с помощью js? Они читают ближайший JSON (сгенерированный сценарием экспорта) и ищут там новое имя файла. Таким образом, пользователь открывает статический неизмененный A.html, JS внутри ищет в A.json новое имя и перенаправляет пользователя на A-2020-08-11.html. Я не уверен, что браузеры позволяют читать файлы JSON из JS для файлов, открытых с сетевого диска.
  • Единственный оставшийся способ - остановить сетевой ресурс или\и закрыть открытые файлы на стороне сервера.
  • Может быть, прикол с отключением предпросмотра в этой папке\полностью?
person filimonic    schedule 10.08.2020
comment
Удалить не работает. Это вывод: Exception calling "Delete" with "1" argument(s): "Access to the path '\\RemoteComputer\somepath\test.html' is denied." - person miguello; 11.08.2020
comment
То же самое с Move - person miguello; 11.08.2020
comment
Вы уверены, что проблема связана с file is locked? Не уверен, что Locked file выдает ошибку AccessDenied. В любом случае, если вы перейдете на веб-сервер, проблем не будет. - person filimonic; 11.08.2020
comment
Ну, я не уверен, правильно ли я использую термины, но это точно - если файл на удаленном общем диске выбран в проводнике Windows с включенной панелью предварительного просмотра, то я ничего не могу сделать с ним с помощью PowerShell. Как только я отменяю выбор файла (примерно через 5-10 секунд), все работает нормально. - person miguello; 11.08.2020
comment
Ну, а если файл заблокирован пользователем в таком режиме, то трогать его нельзя. Подумайте о других вариантах - person filimonic; 11.08.2020

Попробуйте с -Force. Но мне кажется, что это больше проблема разрешения.

Remove-Item -Path '\\server\share\file' -Force
person Kluk    schedule 11.08.2020
comment
Да пробовал уже - не помогло. По-видимому, это хорошо известная проблема (не только с Powershell), когда удаленный файл блокируется панелью предварительного просмотра. А что касается проблемы с разрешениями - все работает только тогда, когда я убираю фокус с этого файла в проводнике Windows - person miguello; 11.08.2020
comment
Хорошо, я попробовал на своей стороне, и я не могу воспроизвести ошибку. Когда я удаляю файл, расположенный на сервере, проводник просто закрывает предварительный просмотр. Где файлы, которые нужно удалить? SMB-сервер? Если это ваш случай, вы можете попробовать Close-SmbOpenFile. Я нашел некоторую помощь здесь: serverfault.com/questions/718875/ - person Kluk; 12.08.2020