Updated: Use PowerShell Module OneDrive from PowerShellGallery to work with OneDrive via command line
wrote a PowerShell module to work with OneDrive via command line. The module use the documented OneDrive web API from Microsoft (https://dev.onedrive.com/README.htm). If you already have the module PowerShellGet to access PowerShellGallery installed, you can easily download this module with a single command:
Install-Module -Name OneDrive -Scope CurrentUser
You can update the module to a newer version with the same command (add -force). If you don‘t use PowerShellGet currently, go to the Gallery on https://www.powershellgallery.com/packages/OneDrive and click on “Get Started”.
If you have any questions or feature requests, write me an email or get in touch with me via www.twitter.com/MarcelMeurer
Features (version 0.9.2 or higher)
The actual version of this module supports:
- Authentication with OneDrive (half web-based)
- Get properties of folder and files
- List folders and files
- Search files and folders
- Create folders
- Delete folders and files
- Download files
- Upload files (up to 100 Mbyte)
Next features to be implemented:
- Rename files and folders
- Check if an unattended login for authentication without a web form is possible
- …
How to use the module (examples)
The functions accept a wider range of parameters as used in these examples. To display all parameters, examples and a description use “get-help”:
get-help Get-ODChildItems -detailed
To display all functions of this module type:
Get-Command -Module OneDrive
You can address files and folders through their path (-path) or element id (-ElementID).
Authentication
For each interaction with the OneDrive API you need an access token. You can generate a fresh token for reading and writing access (this lasts for 1 hour) with:
$Authentication=Get-ODAuthentication -ClientID “00000000……..”
$AuthToken=$Authentication.access_token
Get-ODAuthentication opens a browser window to authenticate yourself with your live id and to accept access through this module.
You can get your own client id on https://apps.dev.microsoft.com
Update: Make sure that you generate a client id in the section ‘Converged applications’ for the token-based authentication and select “Allow implicit flow”. Here is a short video: https://youtu.be/oyILyPQ066E
List all OneDrives available to your account (normally only one)
1
2 3 4 5 6 7 |
Get-ODDrives -AccessToken $AuthToken
id driveType owner quota
— ——— —– —–
8badcff017eaa324 personal @{user=} @{deleted=21419952; remaining=22945965909; state=normal; total=42949672960; used… |
List folders and files in your OneDrive root:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Get-ODChildItems -AccessToken $AuthToken -Path “/” | ft
name size lastModifiedDateTime id folder
—- —- ——————– — ——
Backups 1377598479 2015-10-30T19:24:08.84Z 8BADCFF017EAA324!4036 @{childCount=2}
Bilder 1503567 2016-02-19T20:28:03.243Z 8BADCFF017EAA324!12091 @{childCount=2}
Data 0 2016-02-21T12:17:54.26Z 8BADCFF017EAA324!12158 @{childCount=4}
Daten 24606 2015-12-07T09:03:17.877Z 8BADCFF017EAA324!4034 @{childCount=1}
Dokumente 968612599 2016-02-19T10:25:43.923Z 8BADCFF017EAA324!129 @{childCount=4}
Eigene Bilder 14963858114 2016-02-19T20:29:37.057Z 8BADCFF017EAA324!1205 @{childCount=42}
Musik 0 2015-10-01T12:00:24.467Z 8BADCFF017EAA324!11786 @{childCount=0}
Videos 2689233875 2015-11-04T11:33:21.09Z 8BADCFF017EAA324!9602 @{childCount=1}
demo.xls 2873344 2016-02-19T20:57:18.08Z 8BADCFF017EAA324!12156
Notes.txt 2467 2016-02-15T20:01:15.1Z 8BADCFF017EAA324!12102 |
List folders and files in the folder “/data”
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Get-ODChildItems -AccessToken $AuthToken -Path “/data” | ft
name size lastModifiedDateTime id folder
—- —- ——————– — ——
backup 0 2016-02-21T12:17:11.64Z 8BADCFF017EAA324!12160 @{childCount=0}
documents 0 2016-02-21T12:17:54.26Z 8BADCFF017EAA324!12161 @{childCount=2}
log files 0 2016-02-21T12:17:02.043Z 8BADCFF017EAA324!12159 @{childCount=0}
pictures 0 2016-02-21T12:17:36.97Z 8BADCFF017EAA324!12162 @{childCount=0}
List folders and files in the folder “data” by element id:
Get-ODChildItems -AccessToken $AuthToken –ElementID 8BADCFF017EAA324!12158
(same as above) |
Create a new folder “2016” under “/data/documents”
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
New-ODFolder -AccessToken $AuthToken -Path “/data/documents” -FolderName “2016”
@odata.context : https://api.onedrive.com/v1.0/$metadata#drives(‘me’)/items(‘root%252Fdata%252Fdocuments’)/childr
en/$entity
createdBy : @{application=; user=}
createdDateTime : 2016-02-21T12:36:22.337Z
cTag : adDo4QkFEQ0ZGMDE3RUFBMzI0ITEyMTY1LjYzNTkxNjU0OTgyMzM3MDAwMA
eTag : aOEJBRENGRjAxN0VBQTMyNCExMjE2NS4w
id : 8BADCFF017EAA324!12165
lastModifiedBy : @{application=; user=}
lastModifiedDateTime : 2016-02-21T12:36:22.337Z
name : 2016
parentReference : @{driveId=8badcff017eaa324; id=8BADCFF017EAA324!12161; path=/drive/root:/Data/documents}
size : 0
webUrl : https://onedrive.live.com/redir?resid=8BADCFF017EAA324!12165
fileSystemInfo : @{createdDateTime=2016-02-21T12:36:22.337Z; lastModifiedDateTime=2016-02-21T12:36:22.337Z}
folder : @{childCount=0} |
Upload a file to OneDrive “/data/documents/2016”
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Add-ODItem -AccessToken $AuthToken -Path “/Data/documents/2016” -LocalFile “AzureML with PowerShell.docx”
StatusCode : 201
StatusDescription : Created
Content : {“@odata.context”:”https://api.onedrive.com/v1.0/$metadata#drives(‘me’)/items/$entity”,”@content.do
wnloadUrl”:”https://public.dm2302.livefilestore.com/y3mNucsMgwxhhk3DbsU_DqpD7wo5LD_0Un3dfNzMPrPI3tQ
D4…
RawContent : HTTP/1.1 201 Created
Content-Location: https://mczd5q.dm2302.livefilestore.com/y3p5-QWu8f3PAjkT2zaXz-j4h_viQ6QeiYcItUYJb
yaWf6jDcUzohA4FnsRHqzAgJQIasPyCrezR0fzN4Ip3qiekBXFkcH3ThDCO_0hJwgdGVcBWidznZfE-…
Forms : {}
Headers : {[Content-Location, https://mczd5q.dm2302.livefilestore.com/y3p5-QWu8f3PAjkT2zaXz-j4h_viQ6QeiYcItUY
JbyaWf6jDcUzohA4FnsRHqzAgJQIasPyCrezR0fzN4Ip3qiekBXFkcH3ThDCO_0hJwgdGVcBWidznZfE-lx0jz7t18ZN_IrZ55b
mahWs7DF7GrMEtOV3DPTg_3WwQFU3k601mW_3YfokTBZBmTcyAqe7p9D6], [X-WLSPROXY, BN1301____PAP100],
[X-MSNSERVER, DM2302____PAP236], [Strict-Transport-Security, max-age=31536000;
includeSubDomains]…}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 1435 |
Get some metadata of a file or folder
1
2 3 4 5 6 7 8 9 10 11 12 13 |
Get-ODItemProperty -AccessToken $AuthToken -Path “/Data/documents/2016/AzureML with PowerShell.docx”
@odata.context : https://api.onedrive.com/v1.0/$metadata#drives(‘me’)/items(name,size,lastModifiedDateTime,id,fol
der)/$entity
name : AzureML with PowerShell.docx
size : 110804
lastModifiedDateTime : 2016-02-21T13:07:41.11Z
id : 8BADCFF017EAA324!12169 |
Get all metadata of a file or folder by element id (“” select all properties)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
Get-ODItemProperty -AccessToken $AuthToken -ElementID 8BADCFF017EAA324!12169 -SelectProperties “”
@odata.context : https://api.onedrive.com/v1.0/$metadata#drives(‘me’)/items/$entity
@content.downloadUrl : https://public.dm2302.livefilestore.com/y3m3fRaVdsz2KgyxKlgGlK6CO744YSaXyk0llE9uhvg96DFAgjdjkjBL
cULS4_Ddh4xcBrp8HvTCmMZsAtXQrOPBPxUD2hYH-PSUoEs-g5foUs5AzcwjCp3s8jo6VCBAGDGD64q2PsgspT-vXlT4ppxd
T7GzvU2yrIT5NUs4Poj9b_KlA7_TZ2-SYfffKJEqZNh
createdBy : @{application=; user=}
createdDateTime : 2016-02-21T13:07:41.11Z
cTag : aYzo4QkFEQ0ZGMDE3RUFBMzI0ITEyMTY5LjI1Nw
eTag : aOEJBRENGRjAxN0VBQTMyNCExMjE2OS4z
id : 8BADCFF017EAA324!12169
lastModifiedBy : @{application=; user=}
lastModifiedDateTime : 2016-02-21T13:09:32.287Z
name : AzureML with PowerShell.docx
parentReference : @{driveId=8badcff017eaa324; id=8BADCFF017EAA324!12165; path=/drive/root:/Data/documents/2016}
size : 110804
webUrl : https://onedrive.live.com/redir?resid=8BADCFF017EAA324!12169
file : @{hashes=; mimeType=application/vnd.ms-word.document.12}
fileSystemInfo : @{createdDateTime=2016-02-21T13:07:41.11Z; lastModifiedDateTime=2016-02-21T13:07:41.11Z} |
Download a file from OneDrive
1
2 3 |
Get-ODItem -AccessToken $AuthToken -Path “/Data/documents/2016/Powershell array custom objects.docx”
0 |
If “0” returnes, the download was successful
Delete an item
1
2 3 |
Remove-ODItem -AccessToken $AuthToken -Path “/Data/documents/2016/Azure-big-picture.old.docx”
0 |
If “0” returnes, the download was successful
Search for items in a sub folder recursively
Take a look at OneDrive API documentation to see how the search (preview) works (file and folder names, in file search, …)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
Search-ODItems -AccessToken $AuthToken -Path “/My pictures” -SearchText “FolderA” | ft
name size lastModifiedDateTime id folder
—- —- ——————– — ——
FolderA 0 2016-02-18T15:03:28.637Z 8BADCFF017EAA324!12106 @{childCount=0}
FolderA 10 0 2016-02-18T15:05:28.94Z 8BADCFF017EAA324!12116 @{childCount=0}
FolderA 1 0 2016-02-18T15:03:43.337Z 8BADCFF017EAA324!12107 @{childCount=0}
FolderA 3 0 2016-02-18T15:03:50.28Z 8BADCFF017EAA324!12109 @{childCount=0}
FolderA 8 0 2016-02-18T15:05:02.11Z 8BADCFF017EAA324!12114 @{childCount=0}
FolderA 7 0 2016-02-18T15:04:58.11Z 8BADCFF017EAA324!12113 @{childCount=0}
FolderA 4 0 2016-02-18T15:04:40.04Z 8BADCFF017EAA324!12110 @{childCount=0}
FolderA 13 0 2016-02-18T15:05:36.23Z 8BADCFF017EAA324!12119 @{childCount=0}
FolderA 12 0 2016-02-18T15:05:33.76Z 8BADCFF017EAA324!12118 @{childCount=0}
FolderA 14 0 2016-02-18T15:05:45.253Z 8BADCFF017EAA324!12120 @{childCount=0}
FolderA 2 0 2016-02-18T15:03:45.927Z 8BADCFF017EAA324!12108 @{childCount=0}
FolderA 9 0 2016-02-18T15:05:09.72Z 8BADCFF017EAA324!12115 @{childCount=0}
FolderA 6 0 2016-02-18T15:04:46.03Z 8BADCFF017EAA324!12112 @{childCount=0}
FolderA 11 0 2016-02-18T15:05:31.397Z 8BADCFF017EAA324!12117 @{childCount=0}
FolderA 5 0 2016-02-18T15:04:43.11Z 8BADCFF017EAA324!12111 @{childCount=0} |
Delete all files and folders found with Search-ODItems (be careful)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
foreach ($element in Search-ODItems -AccessToken $AuthToken -Path “/My pictures” -SearchText “FolderA”) {Remove-ODItem -AccessToken $AuthToken -ElementID $element.id}
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0 |
Download all files found with Search-ODItems
1
2 3 4 5 6 7 |
foreach ($element in Search-ODItems -AccessToken $AuthToken -Path “/My pictures” -SearchText “Marcel”) {Remove-ODItem -AccessToken $AuthToken -ElementID $element.id}
0
0
0 |
Available functions
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
CommandType Name Version Source
———– —- ——- ——
(internal) Format-ODPathorIDString 0.9.2 OneDrive
Function Get-ODAuthentication 0.9.2 OneDrive
Function Get-ODChildItems 0.9.2 OneDrive
Function Get-ODDrives 0.9.2 OneDrive
Function Get-ODItem 0.9.2 OneDrive
Function Get-ODItemProperty 0.9.2 OneDrive
(internal) Get-ODWebContent 0.9.2 OneDrive
Function New-ODFolder 0.9.2 OneDrive
Function Add-ODItem 0.9.2 OneDrive
Function Remove-ODItem 0.9.2 OneDrive
Function Search-ODItems 0.9.2 OneDrive |