Всем доброе утро,
У меня есть интересная проблема с приведенным ниже кодом, но сначала немного предыстории.
Onedrive не любит работать с перемещаемыми профилями домена. Когда OneDrive устанавливается для пользователя, он устанавливает OneDrive в папку «Appdata \ local» компьютера, а не на весь компьютер. Это означает, что он будет использовать эту установленную версию для этого конкретного ПК, пока он не будет обновлен до более новой версии. Если пользователь переходит на hotdesk с другого компьютера, на котором его версия Onedrive старше или новее, Onedrive не сможет работать для него на этом компьютере, поскольку он извлекает информацию об учетной записи из перемещаемого профиля в реестре. Реестр сравнивает версию в перемещаемом профиле с версией, установленной в Appdata / Local, и не запускается.
Приведенный ниже сценарий, составленный мной и с помощью других (с обращением к томалак), должен делать следующее:
Он выполнит последнюю задачу, потому что, когда вы удалите 2 слова и ключ из ключа Onedrive и запустите OneDrive, он создаст другую папку в «LOCALAPPDATA \ Microsoft \ OneDrive», размер которой составляет около 100 МБ. В идеале я хотел бы разместить этот скрипт в групповой политике, чтобы он запускался при входе в систему каждого пользователя.
$oneDriveInstallDir = "$env:USERPROFILE\appdata\local\Microsoft\OneDrive"
$Versionarray = 13..20
if (Test-Path $oneDriveInstallDir) {
Stop-Process -Name "OneDrive" -Force
$currentVersion = (Get-ItemProperty HKCU:\SOFTWARE\Microsoft\OneDrive -Name "Version").Version
Remove-ItemProperty HKCU:\SOFTWARE\Microsoft\OneDrive -Name "Version" -Force
Remove-ItemProperty HKCU:\SOFTWARE\Microsoft\OneDrive -Name "CurrentVersionPath" -Force
Remove-Item "HKCU:\SOFTWARE\Microsoft\OneDrive\$currentVersion" -Force
Start-Process $oneDriveInstallDir/OneDrive.exe
}
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\OneDrive" -Recurse | Where-Object {
$item = $_
$item -is [System.IO.DirectoryInfo] -and (
$Versionarray | Where-Object { $item.Name.Contains($_) }
)
} | Remove-Item -Recurse -Force
Stop-Process –Name invalidprocess -ErrorAction SilentlyContinue -ErrorVariable ProcessError;
If ($ProcessError) {
Write-Warning -Message "Some of these folders are in use.";
}
Проблема
При запуске скрипта он спросит, хочу ли я продолжить и удалить запрошенные элементы. Я действительно не хочу, чтобы он спрашивал, даже несмотря на команды силы, которые он все еще запрашивает. Основная проблема заключается в том, что затем он начнет удалять все элементы в разделе реестра OneDrive, чего не следует делать. Я попытался выполнить отладку перед тем, как спросить, но не могу найти причину. См. Пример файлов, которые он пытается удалить ниже:
Спасибо, что посмотрели.





Подсказка
Используйте переключатель -Confirm:$false с командами Remove-ItemProperty и / или Remove-Item, чтобы избавиться от подсказки.
Удаление куста реестра OnDrive
Если для $currentVersion не задано значение, следующая часть вашего скрипта удалит куст реестра OnDrive:
Remove-Item "HKCU:\SOFTWARE\Microsoft\OneDrive\$currentVersion" -Force
Теперь вы можете установить его с помощью
OneDriveSetup.exe /allusers
который устанавливает его в "C: \ Program Files (x86)" один раз для каждой системы, а не в AppData для каждого пользователя.
Это рекомендуемый процесс установки MSFT. Эта установка также удалит предыдущие версии, установленные в AppData.
Ответ @TobyU не решил вашу проблему?