Verwenden des OneDrive PowerShell Moduls aus der PowerShell Gallery für den Zugriff auf OneDrive per Kommandozeile
Ich habe ein PowerShell Modul geschrieben, mit dem per Kommandozeile mit OneDrive gearbeitet werden kann. Das Modul verwendet die dokumentiert OneDrive API (https://dev.onedrive.com/README.htm). Wenn PowerShellGet bereits auf dem Rechner installiert ist, lässt sich das OneDrive Modul mit einem Befehl laden und installieren:
Install-Module -Name OneDrive -Scope CurrentUser
Ebenso lässt sich das Modul mit dem gleichen Befehl aktualisieren (bitte -force anhängen). Falls PowerShellGet aktuell nicht vorhanden ist, lässt sich dies hier nachholen: https://www.powershellgallery.com/packages/OneDrive – „Get Started“.
Bei Fragen oder Wünschen nach weiteren Features für dieses Modul – schreibt mich an oder kontaktiert mich über Twitter (www.twitter.com/MarcelMeurer).
Features (Version 0.9.2 und höher)
Die aktuelle Version von diesem Modul unterstützt:
- Authentifizierung mit OneDrive (öffnet ein Browserelement zur Authentifizierung)
- Liest Eigenschaften von Dateien und Verzeichnissen
- Listet Dateien und Verzeichnisse auf
- Sucht nach Dateien und Verzeichnisse
- Erstellt OrdnerLöscht Dateien und Verzeichnisse
- Download von Dateien
- Upload von Dateien (bis ca. 100 Mbyte)
Ausblick auf die nächsten Features, die ich noch implementieren werde:
- Das Umbenennen von Dateien und Verzeichnissen
- Prüfen, ob eine Anmeldung rein auf Kommandozeile ohne Browserelement funktionieren kann
- …
Wie das Modul und die Funktionen zu nutzen sind (Beispiele)
Die Funktionen akzeptieren viele Parameter, von denen in den Beispielen nur wenige genutzt werden. Um alle Parameter anzuzeigen, kann man „get-help“ verwenden:
get-help Get-ODChildItems -detailed
Der folgende Befehl zeigt alle Funktionen des Moduls an:
Get-Command -Module OneDrive
Dateien und Ordner können durch ihren Pfad (-path) oder der ID (-ElementID) angegeben werden.
Authentifizierung
Für jeden Zugriff auf die OneDrive API ist ein gültiges Access Token notwendig. Diese lässt sich mit folgender Funktion generieren (das Token ist dann eine Stunde gültig):
$Authentication=Get-ODAuthentication -ClientID “00000000……..”
$AuthToken=$Authentication.access_token
Get-ODAuthentication öffnet ein Browserelement in dem man sich mit seiner Live ID anmelden muss und den Zugriff auf OneDrive bestätigen muss.
Die notwendige Client ID (einmalig) ist kostenlos von Microsoft zu bekommen: https://apps.dev.microsoft.com
Update: Bitte ‘Converged applications’ für die tokenbasierte Authentifizierung auswählen und “allow implicit flow”. Hier ist ein kurzes Video zu Erstellung der Id: https://youtu.be/oyILyPQ066E
Listet alle OneDrives für den Benutzer auf (das ist normalerweise nur eins)
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... |
Listet alle Dateien und Verzeichnisse im Root („/“) auf
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 |
Listet alle Dateien und Verzeichnisse unterhalb von „/data“ auf
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) |
Erstellt das Verzeichnis „2016“ unterhalb von „/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 fileSystemInfo : @{createdDateTime=2016-02-21T12:36:22.337Z; lastModifiedDateTime=2016-02-21T12:36:22.337Z} folder : @{childCount=0} |
Hochladen einer DOCX Datei nach „/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 D4... RawContent : HTTP/1.1 201 Created 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 |
Liest bestimmte Metadaten (Eigenschaften) von Dateien und Verzeichnissen
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 |
Liest alle Metadaten (Eigenschaften) von Dateien und Verzeichnissen
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 "" @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 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 einer Datei von OneDrive
1
2
3
|
Get-ODItem -AccessToken $AuthToken -Path "/Data/documents/2016/Powershell array custom objects.docx" 0 |
Der Rückgabewert „0“ zeigt den erfolgreichen Download an
Löscht eine Datei oder Verzeichnis
1
2
3
|
Remove-ODItem -AccessToken $AuthToken -Path "/Data/documents/2016/Azure-big-picture.old.docx" 0 |
Der Rückgabewert „0“ zeigt den erfolgreichen Download an
Sucht rekursive Dateien und Ordner unterhalb von „My pictures“
Um genau zu erfahren, wie die Suche der Prewview Funktion funktioniert (in Namen, in Dateiinhalten, etc.) seht in der OneDrive API nach.
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} |
Löscht alle Dateien und Ordner, die durch die obige Suchfunktion gefunden wurden (Vorsicht)
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 |
Lädt alle Dateien einer Suche mit Search-ODItems herunter (Vorsicht bei gleichen Dateinamen)
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 |
Verfügbare Funktionen
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 |