| | 0

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
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}

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
                    Content-Location: https://mczd5q.dm2302.livefilestore.com/y3p5-QWu8f3PAjkT2zaXz-j4h_viQ6QeiYcItUYJb
                    yaWf6jDcUzohA4FnsRHqzAgJQIasPyCrezR0fzN4Ip3qiekBXFkcH3ThDCO_0hJwgdGVcBWidznZfE-...
Forms             : {}
                    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 ""
@odata.context       : https://api.onedrive.com/v1.0/$metadata#drives('me')/items/$entity
                       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 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