У меня есть запланированный скрипт, который выводит кучу HTML-файлов со статическими именами в удаленное место. Я заметил, что если один из этих файлов выбран в проводнике Windows, чтобы его содержимое отображалось на панели предварительного просмотра, то Powershell не может перезаписать этот файл и пропускает его обновление. Это происходит только в том случае, если выходные файлы находятся в удаленном месте. Работает нормально, если файлы локальные. Как заставить PowerShell перезаписать удаленные файлы в этой ситуации? Многие пользователи работают с этими отчетами, и если один из них закроет окно проводника Windows с одним из этих файлов, выделенным на ночь при запуске скрипта, файл не будет обновлен.
Файл, выбранный в WindowsExplorer с панелью предварительного просмотра, блокирует файл, поэтому powershell не может выводить данные в этот файл.
Ответы (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
Удалить не работает. Это вывод:
Exception calling "Delete" with "1" argument(s): "Access to the path '\\RemoteComputer\somepath\test.html' is denied."
- person miguello; 11.08.2020
То же самое с
Move
- person miguello; 11.08.2020
Вы уверены, что проблема связана с
file is locked
? Не уверен, что Locked file
выдает ошибку AccessDenied. В любом случае, если вы перейдете на веб-сервер, проблем не будет.
- person filimonic; 11.08.2020
Ну, я не уверен, правильно ли я использую термины, но это точно - если файл на удаленном общем диске выбран в проводнике Windows с включенной панелью предварительного просмотра, то я ничего не могу сделать с ним с помощью PowerShell. Как только я отменяю выбор файла (примерно через 5-10 секунд), все работает нормально.
- person miguello; 11.08.2020
Ну, а если файл заблокирован пользователем в таком режиме, то трогать его нельзя. Подумайте о других вариантах
- person filimonic; 11.08.2020
Попробуйте с -Force. Но мне кажется, что это больше проблема разрешения.
Remove-Item -Path '\\server\share\file' -Force
person
Kluk
schedule
11.08.2020
Да пробовал уже - не помогло. По-видимому, это хорошо известная проблема (не только с Powershell), когда удаленный файл блокируется панелью предварительного просмотра. А что касается проблемы с разрешениями - все работает только тогда, когда я убираю фокус с этого файла в проводнике Windows
- person miguello; 11.08.2020
Хорошо, я попробовал на своей стороне, и я не могу воспроизвести ошибку. Когда я удаляю файл, расположенный на сервере, проводник просто закрывает предварительный просмотр. Где файлы, которые нужно удалить? SMB-сервер? Если это ваш случай, вы можете попробовать Close-SmbOpenFile. Я нашел некоторую помощь здесь: serverfault.com/questions/718875/
- person Kluk; 12.08.2020