Google drive komplexer upload per batch oder powershell
Ich stehe vor einer großen herausforderung.
und zwar wollte ich meine private Filmsammlung auf google drive auslagern. Dabei möchte ich das die vorhandenen Filmdateien aus den Ordnern nach google drive hochgeladen werden und dann der freigegebene Link zum anschauen in eine txt datei exportiert wird die den gleichen Namen trägt wie die videodatei die hochgeladen wurde.
Also die Ordnerstruktur wäre:
C:/Stadtbahn1/film.avi
C:/Stadtbahn2/aufnahme.avi
C:/Stadtbahn3/video.avi
etc...
...
es sollte jetzt also nach und nach die .avi datei nach google drive hochgeladen werden, und danach der Shared Link abgefragt werden. Dieser sieht in etwa so aus https://drive.google.com/file/d/0B4EC67MaIdzcTzc4RElIXUlhVWc/
davon dann nur das 0B4EC67MaIdzcTzc4RElIXUlhVWc in eine txt datei schreiben/exortieren die den gleichen namen trägt wie die .avi datei. In diesem Beispiel film.txt oder aufnahme.txt
anschließend muss die videodatei gelöscht werden und die jeweilige txt datei in das jeweilige verzeichnis kopiert werden.
is sowas überhaupt möglich???
Hoffe mir kann jemand helfen
und zwar wollte ich meine private Filmsammlung auf google drive auslagern. Dabei möchte ich das die vorhandenen Filmdateien aus den Ordnern nach google drive hochgeladen werden und dann der freigegebene Link zum anschauen in eine txt datei exportiert wird die den gleichen Namen trägt wie die videodatei die hochgeladen wurde.
Also die Ordnerstruktur wäre:
C:/Stadtbahn1/film.avi
C:/Stadtbahn2/aufnahme.avi
C:/Stadtbahn3/video.avi
etc...
...
es sollte jetzt also nach und nach die .avi datei nach google drive hochgeladen werden, und danach der Shared Link abgefragt werden. Dieser sieht in etwa so aus https://drive.google.com/file/d/0B4EC67MaIdzcTzc4RElIXUlhVWc/
davon dann nur das 0B4EC67MaIdzcTzc4RElIXUlhVWc in eine txt datei schreiben/exortieren die den gleichen namen trägt wie die .avi datei. In diesem Beispiel film.txt oder aufnahme.txt
anschließend muss die videodatei gelöscht werden und die jeweilige txt datei in das jeweilige verzeichnis kopiert werden.
is sowas überhaupt möglich???
Hoffe mir kann jemand helfen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 306319
Url: https://administrator.de/forum/google-drive-komplexer-upload-per-batch-oder-powershell-306319.html
Ausgedruckt am: 19.04.2025 um 17:04 Uhr
6 Kommentare
Neuester Kommentar
Bei Interesse meldst dich bei mir für ein Angebot.
Per Powershell habe ich das hier ja für Google-Mail via Rest-API schon mal gezeigt.
Powershell: Googlemail (GMail) nativ mit Powershell verwalten
Grüße Uwe
Per Powershell habe ich das hier ja für Google-Mail via Rest-API schon mal gezeigt.
Powershell: Googlemail (GMail) nativ mit Powershell verwalten
Grüße Uwe
Da hier vom TO nichts kommt kommt eben mal was von mir. Vielleicht kann ja jemand anderes was damit anfangen.
Zur Anpassung siehe Thread zur GMail-Verwaltung oben. Das Hochladen der Files, das anschließende Löschen und Erstellen der Textdateien findet in den letzten 4 Zeilen statt.
Viel Spaß
Grüße Uwe
Zur Anpassung siehe Thread zur GMail-Verwaltung oben. Das Hochladen der Files, das anschließende Löschen und Erstellen der Textdateien findet in den letzten 4 Zeilen statt.
<#
######################################
###### Google-Drive-Funktionen #######
######################################
-> benötigt wird mind. PS Version 3.0
#>
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
# ANPASSUNGEN HIER VORNEHMEN ===========================================================
# Client API Zugangsdaten hier eintragen
$client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com'
$client_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# Array der Bereiche die autorisiert werden sollen (In diesem Beispiel erhält die Anwendung Vollzugriff auf alle Google-Drive Funktionen)
$global:scopes = @('https://www.googleapis.com/auth/drive')
# Pfad in dem das Refresh-Token gespeichert wird mit dem man ein neues Access Token anfordert (Standardmäßig der Ordner in dem das Skript liegt)
$global:token_path = "$(Split-Path $PSCommandPath -Parent)\refresh.token"
# E-Mail-Adresse des Google-Kontos
$global:gmail_email = 'userXYZ@gmail.com'
# ENDE EINRICHTUNG =====================================================================
Add-Type -AssemblyName System.Windows.Forms
<#
-------------------------------------------------------------------------------------------
Funktion: Haupt-Authentifizierungsfunktion (OAuth 2.0) für Zugriffe auf die Google-Dienste
-------------------------------------------------------------------------------------------
#>
function Auth-Google(){
# wenn kein Refresh-Token vorhanden ist, initiale Authorization starten ...
if ((Test-Path $global:token_path)){
$content = gc $global:token_path -TotalCount 1
if ($content.length -gt 0){$global:refresh_token = $content}
}
if(!$global:refresh_token){
$url = "https://accounts.google.com/o/oauth2/auth?scope=$($global:scopes -join " ")&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=$client_id"
# Manuelle Authorization mit Userinteraktion
write-host "Starting Authorization Request in Browser ... (Please Login into your Google-Account, and accept the authorization request, copy the returned code and close the Browser-Window !" -ForegroundColor Green
Start-Process "iexplore.exe" -ArgumentList $url -Wait
$authcode = [System.Windows.Forms.Clipboard]::GetText()
# Get Auth-Code via IE Automation, fully automated.
#$authcode = Get-AuthCode $url
$requestbody = @{
"code"=$authcode
"client_id"=$client_id
"client_secret"=$client_secret
"redirect_uri"='urn:ietf:wg:oauth:2.0:oob'
"grant_type"="authorization_code"
}
$result = Invoke-RestMethod 'https://www.googleapis.com/oauth2/v3/token' -Method Post -Body $requestbody
$global:refresh_token = $result.refresh_token
set-content $global:token_path -Value $global:refresh_token
$global:access_token = $result.access_token
$global:token_expires = $result.expires_in
$global:token_created = get-date
return $true
}else{
# kein access_token vorhanden => neues access_token via refresh holen
if (!$global:access_token){
write-host "Refreshing access_token ..."
$requestbody = @{
"refresh_token"=$global:refresh_token
"client_id"=$client_id
"client_secret"=$client_secret
"grant_type"="refresh_token"
}
Try{
$tokenrequest = Invoke-RestMethod 'https://www.googleapis.com/oauth2/v3/token' -Method Post -Body $requestbody -EA Stop
$global:access_token = $tokenrequest.access_token
$global:token_created = get-date
$global:token_expires = $tokenrequest.expires_in
return $true
}catch{
write-host $_.Exception.Message
return $false
}
}else{
# access_token vorhanden, überprüfe ob es abgelaufen ist
if((((get-date) - $global:token_created).TotalSeconds) -ge $global:token_expires){
# access_token ist abgelaufen => fordere ein neues an
write-host "Access Token has expired ..."
$global:access_token = ""
Auth-Google
}else{
# gültiges access_token vorhanden
return $true
}
}
}
}
function Get-GoogleFileProperties([string]$id, [string]$properties){
try{
Invoke-RestMethod "https://www.googleapis.com/drive/v3/files/0B_Oqbs4tcHfrSDBTVThoaHJZR0E?access_token=$($global:access_token)" -Method Get -Body @{fields=$properties}
}catch{
throw $_.Exception.Message
}
}
function Add-GoogleDriveFolder([string]$foldername){
try{
# Ordner erstellen
$props = @{'name' = $foldername;'mimeType' = 'application/vnd.google-apps.folder'} | ConvertTo-Json
$uri = "https://www.googleapis.com/drive/v3/files/?access_token=$($global:access_token)"
return (Invoke-RestMethod -uri $uri -body $props -Method Post -ContentType "application/json")
}catch{
throw $_.Exception.Message
}
}
function Add-GoogleDriveSharedFile(){
param(
[parameter(mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][Alias('FullName')][string[]]$filepath,
[parameter()][string]$remotefolder
)
begin{
# Autorisierung
if(!(Auth-Google)){
return $false
}
# Ordner suchen / erstellen
if ($remotefolder){
# Ordner suchen
$folderID = Invoke-RestMethod "https://www.googleapis.com/drive/v3/files?access_token=$($global:access_token)" -Method Get -Body @{'q' = "name='$([System.Net.WebUtility]::UrlEncode($remotefolder))' and mimeType = 'application/vnd.google-apps.folder' and not trashed"}
if (!$folderID){
# Ordner erstellen
Add-GoogleDriveFolder $remotefolder
}else{
$folderID = $folderID.files.id
}
}
}
process{
$filepath | %{
try{
# Datei hochladen
write-host "Hochladen von Datei: '$_'" -F Green
$uri = "https://www.googleapis.com/upload/drive/v3/files?uploadType=media&access_token=$($global:access_token)"
$result = Invoke-RestMethod -uri $uri -InFile $_ -Method Post
# metadata der Datei aktualisieren
if ($result){
# Dateinamen aktualisieren
$props = @{
'name' = [System.IO.Path]::GetFileName($_)
} | ConvertTo-Json
# Wenn Ordner angegeben wurde lege Parent-Folder fest
$parents = if($folderID){"&addParents=$folderID&removeParents=$((Get-GoogleFileProperties $result.id 'parents').parents -join ',')"}
$uri = "https://www.googleapis.com/drive/v3/files/$($result.id)?access_token=$($global:access_token)$parents"
$fileRes = Invoke-RestMethod -uri $uri -body $props -Method Patch -ContentType "application/json"
# Berechtigungen setzen
$props = @{'role' = 'reader';'type' = 'anyone'} | ConvertTo-Json
$uri = "https://www.googleapis.com/drive/v3/files/$($result.id)/permissions?access_token=$($global:access_token)"
$permission = Invoke-RestMethod -uri $uri -body $props -Method Post -ContentType "application/json"
# Daten ausgeben
[pscustomobject]@{'FilePath' = $_ ;'RemoteName' = $fileRes.name; 'ID' = $fileRes.id}
}
}catch{
write-host "Fehler beim Hochladen: $($_.Exception.Message)" -F Red
}
}
}
}
#Alle Videos eines Ordners hochladen, löschen und Textdatei mit ID des Files erstellen
gci 'C:\Ordner\*' -Include "*.avi","*.mp4" -recurse | Add-GoogleDriveSharedFile | %{
remove-Item $_.FilePath -Force
Set-Content "$([System.IO.Path]::GetDirectoryName($_.FilePath))\$([System.IO.Path]::GetFileNameWithoutExtension($_.FilePath)).txt" -Value $_.ID
}
Viel Spaß
Grüße Uwe
Kommt hier noch was ?
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.