早上好,
下面的代码有一个有趣的问题,但首先要介绍一下背景。
Onedrive不喜欢使用域漫游配置文件。为用户安装OneDrive后,它将在PC的“ Appdata \ local”文件夹中而不是整个PC上安装OneDrive。这意味着它将使用该特定PC的安装版本,直到将其更新为较新版本为止。如果用户从另一台PC上的Onedrive版本较旧或较新的PC转到Hotdesk,则Onedrive将无法从该PC上为他们工作,因为它会从注册表中的漫游配置文件中提取帐户信息。注册表会将漫游配置文件中的版本与Appdata / Local中安装的版本进行比较,并且无法启动。
以下由我和其他人帮助(并向tomalak大喊大叫)一起整理的脚本应该执行以下操作:
它将执行最后一个任务,因为当您从Onedrive密钥中删除2个DWords和Key并启动OneDrive时,它将在“ LOCALAPPDATA \ Microsoft \ OneDrive”中创建另一个大约100MB的文件夹。理想情况下,我希望将此脚本放入组策略中,以便在每个用户登录时运行。
$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注册表项中的所有项。我曾在询问之前尝试过调试,但找不到原因。请在下面查看其尝试删除的文件的示例:
谢谢您的光临。
答案 0 :(得分:1)
提示
将-Confirm:$false
开关与Remove-ItemProperty
和/或Remove-Item
命令一起使用以摆脱提示。
删除OnDrive注册表配置单元
如果没有为$currentVersion
设置任何值,则脚本的下面部分将删除OnDrive Registry Hive:
Remove-Item "HKCU:\SOFTWARE\Microsoft\OneDrive\$currentVersion" -Force
答案 1 :(得分:0)
现在您可以使用
进行安装OneDriveSetup.exe /allusers
,每个系统将其安装在“ C:\ Program Files(x86)”中一次,而不是每个用户安装在AppData中。
这是MSFT建议的安装过程。此安装还将删除AppData中安装的先前版本。