97 votes

Comment accéder aux périphériques MTP en ligne de commande dans Windows?

La plupart des appareils MTP (protocole de transfert multimédia) apparaissent dans l'explorateur de fichiers Windows sous leur nom de périphérique ou un GUID, mais ils n'ont pas de lettre de lecteur attribuée.

Comment puis-je accéder aux fichiers de ces appareils en ligne de commande? En utilisant cmd.exe ou PowerShell.

2 votes

Le fait que les implémentations compatibles MTP de Linux telles que gphoto2 offrent un moyen de scripter le téléchargement suggère que cela devrait être possible sur Windows d'une manière ou d'une autre, en supposant que le Lecteur Windows Media ne bloque pas d'une manière ou d'une autre tout autre logiciel d'accéder à l'interface MTP USB... Moi aussi, j'aimerais savoir si c'est possible.

2 votes

J'ai abandonné en essayant de trouver une solution pour cela avec mon appareil Android MTP et finalement installé un serveur WebDAV sur mon appareil. Cela pourrait être monté comme un lecteur réseau, bien que lentement.

0 votes

@MarkBooth J'ai essayé le serveur WebDAV mais il semble que la plupart des fichiers que je transfère soient corrompus (plus de 90%)...

37voto

haimg Points 21323

Malheureusement, les API exposées par MTP sont très différentes des API d'un système de fichiers normal. Par conséquent, exposer un appareil MTP en tant que système de fichiers lecture/écriture n'est pas possible. La principale raison :

Wikipedia dit :

Ni les normes MTP ni PTP ne permettent la modification directe des objets. Au lieu de cela, les objets modifiés doivent être réimportés dans leur totalité, ce qui peut prendre beaucoup de temps pour les gros objets. Avec PTP/MTP, la taille du fichier doit être connue à l'étape d'ouverture.

Votre programme de copie de fichiers standard ouvre simplement un fichier source et un fichier cible, et copie les données par blocs du fichier source vers le fichier cible. Cela ne fonctionnera pas avec MTP, car vous devez utiliser des fonctions spéciales MTP, et les primitives de système de fichiers génériques (lecture, recherche, écriture) ne sont pas disponibles.

Il existe également d'autres limitations. Par exemple, le nombre de fichiers pouvant être lus ou écrits simultanément sur un appareil MTP est sévèrement limité. L'appareil ne se comporte tout simplement pas comme un système de fichiers.

Je suppose qu'un pilote de système de fichiers lecture seule pour un appareil MTP pourrait être possible, mais en raison des problèmes évoqués ci-dessus, il sera de très peu d'utilité, donc personne ne s'est donné la peine de le créer.

5 votes

Le pilote de système de fichiers en lecture seule semble maintenant exister : ptpdrive.com

11 votes

En fait, ce n'est pas "impossible". Lorsque vous considérez que j'ai gphotofs et mtpfs en tant que systèmes de fichiers FUSE sur Linux qui sont COMPLÈTEMENT en lecture/écriture, il est tout à fait possible d'accomplir ceci en tant que "lettre de lecteur" sous Windows... ils n'ont simplement pas rendu cela disponible ou facile.

12voto

barbalion Points 81

Il existe un programme propriétaire (mais quand même agréable) : MTP Drive (https://www.mtpdrive.com/) qui vous permet de "monter" les périphériques MTP en tant que lecteurs dans Windows. Avec quelques limitations raisonnables, il fait du bon travail !

1 votes

1. Est-ce que ce lecteur MTP synthétique peut être alimenté aux outils de récupération de données de lecteur ordinaires comme EASEUS/Recuva/R-Studio et les données peuvent être récupérées efficacement?
2. Est-ce que je peux utiliser robocopy/autres outils de transfert de données rapide pour transférer des données de ce lecteur aux lecteurs natifs de Windows (C/D etc.) efficacement?

0 votes

@SIslam, oublie l'efficacité dans ce cas. En raison de la première réponse à la question, la nature de l'API est trop différente.

2 votes

Merci, ça a marché pour moi! En python: os.path.exists("Z:\DCIM") == True où Z est la lettre du "drive" que j'ai assignée à la mémoire de mon téléphone et DCIM où se trouvent les images.

3voto

Jarzka Points 682

J'ai réussi à monter avec succès un Garmin Descent Mk2i (à utiliser avec SubSurface Dive Log) en utilisant MTPMount (un projet open source) Release 9.18.0 sur Windows 10.

Cela nécessite d'installer Dokan (Dokany 1.5.1.1000) qui expose un système de fichiers FUSE aux applications Windows.

NOTE 1: À l'heure actuelle, la dernière version (19.8.0, liée ci-dessus) de MTPMount n'a pas été mise à jour pour fonctionner avec la dernière version v2.x de Dokan, vous devez utiliser la version 1.5.1.1000 de Dokany

NOTE 2: MTPMount est une application en ligne de commande et il n'est pas évident de savoir ce qu'il faut taper.
Après quelques minutes de tentatives infructueuses, j'ai trouvé que ce qui suit a fonctionné pour moi.

.\mtpmount-x64.exe mount "Descent Mk2i" "Primary"

0 votes

Meilleure réponse. Windows Explorer ne fonctionne pas avec des milliers de fichiers dans un seul dossier. Avec MTPMount, je peux désormais accéder aux fichiers via la ligne de commande. Mais par exemple, "dir" dans Powershell génère un Timeout. robocopy fonctionne très bien.

0 votes

Est-ce que quelqu'un a réussi à faire fonctionner mtpmount avec un iPhone ou un iPad? Je peux voir l'iPad avec mais ou donnent tous deux l'erreur : "Aucun support de stockage portant le nom Internal Storage n'a été trouvé sur l'Apple iPad. Cela peut être dû à une faute d'orthographe ou à votre appareil qui n'est pas déverrouillé."

0 votes

J'ai également essayé mtpdrive et cela fonctionne un peu mais il y a beaucoup d'erreurs et pour copier >30 fichiers, cela coûte $50. Pour ceux qui veulent simplement extraire leurs photos des griffes d'Apple sans succomber à un abonnement iCloud @#$(*@, j'ai fini par faire ceci: FE File Explorer Pro en train de faire une "sauvegarde" de l'album "Récents" dans la Photothèque vers un partage SMB "iPadBackup" sur le serveur unraid. Pendant que cela se fait, il y a des erreurs. Ensuite, j'ouvre l'explorateur Windows, je recherche le nom de fichier, je le supprime, puis je appuie à nouveau sur le bouton "sauvegarde". OMG Je déteste Apple

1voto

Thebluefish Points 131

Vous pourriez peut-être bricoler quelque chose avec le kit de portage MTP's MTPMon.

Alternativement, PowerShell peut créer des objets COM et appeler leurs méthodes, ainsi vous pourriez être en mesure d'utiliser les API que Windows Explorer utilise (par exemple, GetDeviceInfo() et GetObjectInfo()).

1 votes

@BerinLoritsch J'ai posté un exemple en utilisant PowerShell comme (possible) réponse ci-dessous: superuser.com/a/1770284/1554065

0voto

Piemol Points 101

S'il est vrai que les téléphones Android utilisent MTP pour se connecter aux ordinateurs lorsqu'ils sont en mode "Transfert de fichiers", alors PowerShell est une solution, j'ai juste répondu à cela sur StackOverflow : https://stackoverflow.com/a/75543733/3090890

Copie légèrement modifiée de ma réponse sur StackOverflow ci-dessous.

J'ai trouvé ce script PowerShell : https://github.com/nosalan/powershell-mtp-file-transfer/ Avertissement : je ne suis pas l'auteur du script, les crédits lui reviennent ! Juste pour cette réponse, j'ai copié et collé des extraits de code de la source liée pour lui fournir quelques explications.

Le truc pour accéder au téléphone, qui devrait être en mode "Transfert de fichiers" lorsqu'il est connecté via USB, se trouve dans cette partie :

$phoneName = "Nokia 7.2"    
$o = New-Object -com Shell.Application
$rootComputerDirectory = $o.NameSpace(0x11)
$phoneDirectory = $rootComputerDirectory.Items() | Where-Object {$_.Name -eq $phoneName} | select -First 1

Ensuite, vous pouvez accéder au répertoire que vous souhaitez :

$sourceFolder = $phoneDirectory
$phoneFolderName = "Internal shared storage\DCIM\Camera"
foreach($pathSegment in ($phoneFolderName -split "\\"))
{
    $sourceFolder = $sourceFolder.GetFolder.Items() | Where-Object {$_.Name -eq $pathSegment} | select -First 1
    if($sourceFolder -eq $null)
    {
      throw "Not found $phoneFolderName folder"
    }
}

Et enfin copier les éléments du sourceFolder atteint vers la destination :

function Get-FullPathOfMtpDir($mtpDir)
{
    $fullDirPath = ""
    $directory = $mtpDir.GetFolder
    while($directory -ne $null)
    {
        $fullDirPath =  -join($directory.Title, '\', $fullDirPath)
        $directory = $directory.ParentFolder;
    }
    return $fullDirPath
}
$targetFolder = "E:\Test"
$destDirShell = (new-object -com Shell.Application).NameSpace($targetFolder)
$fullSourceDirPath = Get-FullPathOfMtpDir $sourceFolder 
foreach ($item in $sourceFolder.GetFolder.Items())
{
    $itemName = ($item.Name)
    $fullFilePath = Join-Path -Path $targetFolder -ChildPath $itemName

    if(Test-Path $fullFilePath)
    {
        Write-Host "Element '$itemName' already exists"
    }
    else
    {
        $copiedCount++;
        Write-Host ("Copying #{0}: {1}{2}" -f $copiedCount, $fullSourceDirPath, $item.Name)
        $destDirShell.CopyHere($item)
    }
}
Write-Host "Copied '$copiedCount' elements from '$fullSourceDirPath'"

Il est également possible de copier des fichiers vers le téléphone. Ici, je change la cible et la source à titre d'exemple, et je copie "E:\Test\atestfileonpc.txt" dans le dossier "DCIM\Camera" du téléphone :

$sourceDirShell = (new-object -com Shell.Application).NameSpace($targetFolder)
$targetDirShell = $sourceFolder
$item = $sourceDirShell.Items() | Where-Object {$_.Name -eq "atestfileonpc.txt"} | select -First 1
targetDirShell.GetFolder.CopyHere($item)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X