Forum Discussion
Is there any way to get the sync status using PowerShell Script?
Hello
Is there any way to get the sync status using PowerShell Script if user is doing syncing first time ?
Avian
- steveprenticeBrass Contributor
The dll mentioned in this thread is good, but I don't want to have to distribute that to everyone's machines, so I came up with an alternative. The script that follows would check OneDrive for a folder called Documents and returns its status.
# ID 303 = "Availability status" | The status is generally one of the following... # "Always available on this device", "Available on this device", "Available when online" $OneDriveDocs = "$env:OneDrive\Documents" $Shell = (New-Object -ComObject Shell.Application).NameSpace((Split-Path $OneDriveDocs)) $Status = $Shell.getDetailsOf(($Shell.ParseName((Split-Path $OneDriveDocs -Leaf))),303)
- martinzimaCopper Contributor
Hi steveprentice,
Thanks for your post!... Interestingly, I spent a lot of time trying to do the same thing myself as was sure I had seen a Windows file property for this but just couldn't get it to work when I tried it. Sadly, after running your code, I got $status = "" and when I manually checked prop:303 using another util I have it didn't show any value for this either... Am wondering if maybe Microsoft recently removed/deprecated this property?
- BoydHeeresCopper Contributor
Hi martinzima,
You and steveprentice send me down a rabithole with your conversation.
I did some digging into what you both mentioned and I figured out that the command only works when you query the folder you are currently in.
With the help of an LLM AI I created a function that reads the information from all the files in the OneDrive and outputs it back out of the function as an object.
It is still not perfect, I just noticed that the .exe files are not properly detected for whatever reason and I suspect I will encounter a few more.
If I remember I will update this site once I have completed it.$Shell = New-Object -ComObject Shell.Application function Get-ShellDetails { param ( [string]$DirectoryPath ) $ShellNamespace = $Shell.NameSpace($DirectoryPath) $Items = $ShellNamespace.Items() foreach ($Item in $Items) { if ($Item.IsFolder -and -not ($Item.Path -match '\.(zip|tar\.gz|7z|rar|tar|gz|bz2|xz|cab|lzma)$')) { Get-ShellDetails -DirectoryPath $Item.Path # Recursive call for nested directories } elseif (-not ($Item.Path -match '\.(zip|tar\.gz|7z|rar|tar|gz|bz2|xz|cab|lzma)$')) { $ShellDetails303 = $ShellNamespace.getDetailsOf($Item, 303) $MergedObject = [PSCustomObject]@{ FullName = $Item.Path Attributes = (Get-Item -Path $Item.Path).Attributes ShellDetails303 = $ShellDetails303 } $MergedStatus.Add($MergedObject) } }
- Theres no way out of the box!
You can use the onedrivelib.dll to fetch some information via a script and it’s a bit tricky to get it to run remotely
Possible values:
Error, Shared, SharedSync, UpToDate, Syncing, ReadOnly, NotInstalled
See here:
https://blogs.msdn.microsoft.com/rodneyviana/2017/06/06/powershell-cmdlet-to-check-onedrive-for-business-or-onedrive-personal-status/
And here:
https://www.intrust-it.com/2017/11/17/centrally-monitor-microsoft-onedrive-sync-status/
Adam- Avian 1Iron Contributor
adam deltinger I aleady saw this url and tried following script
Import-Module ".\OneDriveLib.dll"
Get-ODStatus -ByPath $env:OneDrive
Getting Syncing or OneDemandOruknown during syncing.
How to check in script that once status is UptoDate status, script should terminate especially when user is syncing first time and data size is large. I dont think running in infinite loop is good idea.
Please advise.
Avian
- I think i read somewhere , this breaks if FOD is used though..
I guess writing some sort of IF statement depending on status would help!
What’s your usecase here?