PDA

Показать полную графическую версию : Как взаимодействовать с файлами на смартфоне, подключенном к компьютеру через USB?


Страниц : [1] 2 3

test009
12-04-2019, 22:37
Как взаимодействовать с файлами на смартфоне, подключенном к компьютеру через USB-кабель?

Я подключаю свой смартфон к компьютеру через USB-кабель.
Захожу в Мой компьютер и в списке доступных дисков вижу следующее:

https://i.imgur.com/PPquybb.jpg

Если отрыть свойства, то вот что будет показано:

https://i.imgur.com/RfQNwKy.jpg

Захожу внутрь и вижу это:

https://i.imgur.com/JMHB3JK.jpg

Захожу еще внутрь и вижу структуру каталогов смартфона:

https://i.imgur.com/PwRMKFW.jpg

Хочу автоматизировать некоторые действия по бэкапированию определенных каталогов смартфона (т.е. скопировать файлы из определенных папок на компьютер).
Также хочу удалять файлы из определенных каталогов (лишний мусор).

Для удаления ненужных файлов хочу написать бат-файл что-то типа:
DEL C:\cache

Проблема лишь в том, что я не могу получить полный путь к файлам файловой системы смартфона из BAT-файла.

Может можно путь к устройству как-то вытащить, где-то посмотреть?
Ведь раз он отображается в списке дисков как обычный диск, значит как-то к нему можно обратиться.

Iska
12-04-2019, 22:48
я не могу получить полный путь к файлам файловой системы смартфона из BAT-файла. »
А не факт, что он и есть. Возможно, пути существуют только в представлении Проводника. Скопируйте сюда полный путь из адресной строки.

yurfed
13-04-2019, 01:22
test009, и не забывайте, что папки с точкой спереди, это скрытые папки для ОС, основанных на Linux. Не удалите лишнего.
И обратите внимание что Файловая система-Иерархическая структура

YuS_2
13-04-2019, 08:05
Проблема лишь в том, что я не могу получить полный путь к файлам файловой системы смартфона из BAT-файла. »
Windows со смартами работает не на уровне файловой системы, а по протоколу MTP, если они подключены не как USB-накопитель. Поэтому получить желаемое, весьма проблематично...
В Windows MTP не является файловой системой, а поддерживается на уровне прикладного ПО — поэтому «любимый файловый менеджер» не подойдёт.

test009
13-04-2019, 15:08
А не факт, что он и есть. Возможно, пути существуют только в представлении Проводника. Скопируйте сюда полный путь из адресной строки.

ПУть такой:
Этот компьютер\ASUS_Z010DD\Внутр. накопитель

https://i.imgur.com/2weh64I.jpg

Windows со смартами работает не на уровне файловой системы, а по протоколу MTP, если они подключены не как USB-накопитель. Поэтому получить желаемое, весьма проблематично...

Очень жаль.
Получается, сделать ничего нельзя?
Буду тогда по-другому выкручиваться.

Iska
13-04-2019, 19:33
ПУть такой:
Этот компьютер\ASUS_Z010DD\Внутр. накопитель »
Оставьте только данное окно Проводника и запустите такой скрипт WSH:
Option Explicit

Dim objWebBrowser


With WScript.CreateObject("Shell.Application")
For Each objWebBrowser In .Windows
If InStr(1, TypeName(objWebBrowser.document), "ShellFolderViewDual", vbTextCompare) > 0 Then
WScript.Echo "[" & objWebBrowser.document.Folder & "] " & objWebBrowser.document.Folder.self.Path
End If
Next
End With

WScript.Quit 0

Что получится?

test009
13-04-2019, 23:25
https://i.imgur.com/vFOIu52.jpg

Iska
14-04-2019, 01:08
test009, значит, всё-таки можно будет. Только не «bat-файл», а либо WSH, либо PoSH. И взаимодействовать можно будет с этой квази-системой только через интерфейсы Проводника — Set objFolder = objShell.NameSpace("…тут длинный путь, который на Вашем скриншоте приведён во второй-третьей-четвёртой строках…") и т.д.

YuS_2
14-04-2019, 21:14
тут длинный путь, который на Вашем скриншоте приведён во второй-третьей-четвёртой строках… »
Это несколько зубодробительно получится...
Если говорить о powershell, то можно поступить проще:
Пример получения списка элементов в каталоге с копированием файлов на компьютер:
# Имя смартфона так, как оно выглядит в проводнике
$name = 'Redmi Note 4'

# Путь к каталогу в телефоне, начиная от корневого, так как он выглядит в проводнике
$srcfold = 'Внутренний общий накопитель\Download'

# Целевой каталог:
$dstfold = '.\1'

$shell = new-object -com shell.application

# ssfDRIVES 0x11 (17).
# https://msdn.microsoft.com/en-us/library/windows/desktop/bb774096(v=vs.85).aspx
$tel = $shell.namespace(17).self.getfolder.items()|? name -eq $name
$paths = $srcfold.split('\\')

# Переход к конечному каталогу:
$cur = $tel
foreach ($path in $paths){
if($path){
$cur = $cur.getfolder.items()|? name -eq $path
}
}
# Выборка элементов каталога:
$items = $cur.getfolder.items()
$folders = $items|? isfolder -eq $true
$files = $items|? isfolder -eq $false

# Вывод элементов:
#$folders|select name,isfolder,type
#$files|select name,isfolder,type

# Копирование файлов в $dstfold:
$dst = $shell.namespace((gi $dstfold).fullname).self
foreach ($file in $files){
$dstpath = join-path -path $dstfold -child $($file.name)
if (test-path $dstpath){write-host Файл уже существует} else {
$dst.getfolder.copyhere($file)
}
}

- по аналоги, можно всё усложнить, вплоть до создания псевдо-файлового менеджера...
но это, всё также, не будет полноценным копированием файлов, т.е. файловые операции будут проходить со всеми недостатками протокола MTP...

Iska
14-04-2019, 23:06
т.е. файловые операции будут проходить со всеми недостатками протокола MTP... »
Как будто есть выбор.

P.S. А напрямую нельзя — вместо перебора:

$tel = $shell.namespace(17).self.getfolder.items()|? name -eq $name
$paths = $srcfold.split('\\')

# Переход к конечному каталогу:
$cur = $tel
foreach ($path in $paths){
if($path){
$cur = $cur.getfolder.items()|? name -eq $path
}
}

? Мне проверять не на чем.

YuS_2
15-04-2019, 06:34
А напрямую нельзя — вместо перебора: »
Напрямую было бы можно, если получить заранее, тот самый зубодробительный путь, но где его взять? В этом вся сложность... рекурсии ведь не предоставляет MTP.
А перебором мы, как раз и получаем путь к конечному каталогу. Возможно, способ существует, но мне он не известен, увы...

test009
16-04-2019, 11:25
Понял, попробую, спасибо.

YuS_2
16-04-2019, 15:12
попробую »
Тут, пока было время, состряпал двусторонний копировщик, может пригодится:
powershell
<#
.SYNOPSIS
Отображение или копирование элементов смартфона, подключенного как
устройство MTP

.Description
Скрипт предназначен для выборки, просмотра или копирования элементов
смартфона по протоколу MTP

.Parameter Phonename
Обязательный: Имя смартфона так, как оно выглядит в проводнике

.Parameter Sourcepath
Необязательный: Путь к элементу.
В смартфоне: Начиная от корневого так, как он выглядит в проводнике. Например:
'Внутренний общий накопитель\temp','Внутренний общий накопитель\temp\example.ext'
В компьютере: Указываются либо абсолютные, либо относительные пути.

.Parameter Destinationpath
Необязательный: Путь к целевому каталогу, куда будут копироваться элементы.

.Parameter Filter
Необязательный: Шаблон регулярного выражения (-match), для отбора элементов с
определенным наименованием. Работает только для файлов первого уровня вложенности
Например: '(\.pdf|\.txt)$'

.Parameter From
Переключатель: Для осуществления копирования выборки элементов из смартфона в
компьютер. При отсутствии, список элементов выводится в консоль.

.Parameter To
Переключатель: Для осуществления копирования выборки элементов из компьютера в
смартфон. При отсутствии, список элементов выводится в консоль.

.Example
.\script.ps1 -phone 'Redmi Note 4'

Это пример просмотра корневого(ых) каталогов смартфона.

.Example
.\script.ps1 -phone 'Redmi Note 4' `
-sour 'Внутренний общий накопитель\FOLD','Внутренний общий накопитель\temp\example.ext' `
-dest .\TEST -filt '(\.ext|\.txt|\.jpeg)$|123' -from

Это пример выборки элементов из указанного каталога плюс указанный файл (в смартфоне), с
применением к выборке фильтра. Вся выборка копируется в целевой каталог компьютера .\TEST

.Example
.\script.ps1 -phone 'Redmi Note 4' `
-sour .\TEST\1111,c:\test\run.bat `
-dest 'Внутренний общий накопитель\temp' -filt '(\.bat|\.png)$' -to

Это пример выборки элементов из указанного каталога плюс указанный файл (в компьютере), с
применением к выборке фильтра. Вся выборка копируется в целевой каталог смартфона
'Внутренний общий накопитель\temp'

.Notes
Created By YuS

Version: 1.00
Date: 15/04/2019
Purpose/Change: Первая версия
Version: 2.00
Date: 16/04/2019
Purpose/Change: Добавлена возможность копирования в обе стороны.
Version: 2.01
Date: 17/04/2019
Purpose/Change: Удалена лишняя проверка на существование элемента.
Version: 2.02
Date: 08/11/2020
Purpose/Change: Поправлены баги с копированием из компьютера на устройство.

.Link
http://forum.oszone.net/post-2867970.html#post2867970

#>

[cmdletbinding()]
param (
[parameter(Mandatory=$true)]
[string]$phonename,[string[]]$sourcepath,[string]$destinationpath,[string]$filter,
[switch]$from,[switch]$to
)

function get-folder ($paths){
$cur = $root
if($paths){
foreach ($path in $paths){
$cur = $cur.getfolder.items()|? name -eq $path
}
}
return $cur
}

function get-array ($paths){
foreach ($path in $paths){
if (test-path -lit $path -patht leaf){gi $path -force} else {dir $path -force}
}
}

$shell = new-object -com shell.application

# ssfDRIVES 0x11 (17).
# https://msdn.microsoft.com/en-us/library/windows/desktop/bb774096(v=vs.85).aspx #ссылка устарела
# https://docs.microsoft.com/ru-ru/windows/win32/api/shldisp/ne-shldisp-shellspecialfolderconstants
$root = $shell.namespace(17).self.getfolder.items()|? name -eq $phonename

if (!$destinationpath -and ($to -or $from)){
write-host Необходимо указать целевой каталог -for cyan
exit
}

if ($sourcepath -and (test-path $sourcepath) -contains $true){
if ($from) {
write-host 'Ключ [-from] указывается только при копировании из смартфона' -for red
$from = $false
}
$items = (get-array $sourcepath)|? name -match $filter
$destinat = get-folder $($destinationpath.split('\'))
} else {
if ($to) {
write-host 'Ключ [-to] указывается только при копировании в смартфон' -for red
$to = $false
}
$sarr = if($sourcepath){$sourcepath|%{get-folder $($_.split('\'))}} else {get-folder}
$items = $sarr|%{if($_.isfolder){$_.getfolder.items()} else {$_}}|? name -match $filter
}
if (!$items){write-host Элементы для обработки отсутствуют -for yellow;exit}

if ($to){
$from = $false
foreach ($item in $items){$destinat.getfolder.copyhere($item.fullname)}
} elseif ($from){
if (!(test-path $destinationpath)){md $destinationpath|out-null}
$dst = $shell.namespace((gi $destinationpath).fullname).self
foreach ($item in $items){$dst.getfolder.copyhere($item)}
} else {
$items|select name,isfolder,type|sort isfolder,name
}

Alexoner
07-11-2020, 15:34
YuS_2,
Благодарю за скрипт.
(Правда не очень понимаю как он работает)
Случайно не осталась версия где есть проверка наличия файлов на телефоне?
Чтобы проверять, когда телефон хоть и подключён, но не разблокирован (то есть доступа нет). Из-за чего появляется ошибка при запуске скрипта.

(Windows7 x64, PSVersion 5.1.14409.1005 )

не будет полноценным копированием файлов, т.е. файловые операции будут проходить со всеми недостатками протокола MTP »

Интересно, в чём выражается неполноценное копирование и какие недостатки у MTP?
Вроде копируется нормально.

YuS_2
07-11-2020, 19:45
Случайно не осталась версия где есть проверка наличия файлов на телефоне? »
В смысле поиск файла? Так это, как раз, один из недостатков протокола... нет такой возможности, её можно только имитировать...
Дело в том, что никакой древовидной файловой структуры при работе с MTP, не существует, все действия осуществляются через созданный экземпляр COMObject, путем получения каждого элемента в отдельности, а они существуют только в виде родительского или дочернего (в случае если текущий элемент - каталог) элементов от текущего. В общем, не всё там просто, хоть и не невозможно. И именно поэтому, это достаточно медленные операции...

Чтобы проверять, когда телефон хоть и подключён, но не разблокирован (то есть доступа нет). »
Не каждый смартфон, подключается по MTP протоколу по умолчанию, иногда включается просто зарядка, тогда и будет появляться ошибка, т.к. подключения попросту нет. В этом случае, доступ к смартфону нужен будет обязательно.

Интересно, в чём выражается неполноценное копирование и какие недостатки у MTP? »
Неточно выразился, речь не про копирование, как таковое, а про файловые операции именно с файловой системой...
Media Transfer Protocol (https://ru.wikipedia.org/wiki/Media_Transfer_Protocol)

YuS_2
08-11-2020, 08:19
двусторонний копировщик »
Скрипт обновил, т.к. обнаружился баг...

Alexoner
08-11-2020, 11:12
В смысле поиск файла? »
Я неправильно выразился. Не наличия файлов на телефоне, а проверка наличия пути ресурса. То есть, когда телефон подключается к компьютеру, он виден в проводнике слева как подключённое устройство MTP. Если зайти в него, то там пусто, так как телефон заблокирован. И только после разблокировки через графический ключ пути появляются.
Впрочем, это не столь важная функция, а скорее как дополнительное удобство.
Более важно другое...

Вообще изначально задумка была такая:
- Скопировать файлы с телефона (это работает).
- Проверить по хеш-сумме скопированные файлы с ресурсом.
(так как были случаи, когда фото скопировались битыми. Это обнаружилось потом, а оригиналы уже были удалены).
- Если все файлы прошли проверку, то удалить их с телефона (возможно с предварительным запросом подтверждения у пользователя).

Скорость работы всей этой системы тоже не важна, главное чтобы каждый раз это вручную не делать, так как файлы лежат в разных папках и в разных разделах памяти телефона (во внутренней памяти, на sd-карте, фото, видео, заметки, аудиозаписи, скриншоты и другое).

YuS_2
08-11-2020, 11:50
проверка наличия пути ресурса. »
Для чего? powershell выдаст ошибку, если пути не существует.
Скрипт подключением управлять "не умеет", так что если ресурс существует, он выдаст то, что доступно, если ресурсы не доступны, будет выдана ошибка...
Проверить по хеш-сумме скопированные файлы с ресурсом. »
Что с чем сравнивать?
Дело в том, что никакой древовидной файловой структуры при работе с MTP, не существует, все действия осуществляются через созданный экземпляр COMObject, путем получения каждого элемента в отдельности, а они существуют только в виде родительского или дочернего (в случае если текущий элемент - каталог) элементов от текущего. »
Ни размер файла, ни его хешсуммы по MTP недоступны... все действия с файлами осуществляются самим устройством и его внутренним ПО. Почитайте информацию по ссылке, которую я привел...
Таким образом, плеер, подключившийся как флэш-диск, полностью доверяется компьютеру; подключившийся по MTP — самостоятельно отвечает за хранение и целостность данных
т.е. если файл копируется битым, то ни скрипт, ни компьютер не могут с этим ничего поделать, за это отвечает сам смартфон, то бишь его аппаратно-программная часть, которая работает с внутренними ресурсами устройства.

Alexoner
08-11-2020, 12:25
Для чего? powershell выдаст ошибку »
Чтобы избежать выдачи красной ошибки. Наверное её как-то отлавливать можно. Надо изучить этот вопрос.

Статью читал, но некоторые моменты неправильно понял.
Выходит для проверки нужна проверочная программа установленная в телефоне, и только соединившись с ней (наверное через API) можно получить информацию?

Ну а хотя бы удалять файлы с телефона как-то можно?

YuS_2
08-11-2020, 15:43
Чтобы избежать выдачи красной ошибки. »
так это показатель того, что присутствует ошибка и даже расшифровка есть. Зачем подавлять сообщение? Оно ничем не мешает работе.

Выходит для проверки нужна проверочная программа установленная в телефоне »
Типа того. Но сомневаюсь, что по MTP можно получить что-то более-менее серьезное. Проще подключить устройство по сетке Wi-Fi и управлять файлами в самом устройстве, в том числе и копирование на комп.

Ну а хотя бы удалять файлы с телефона как-то можно? »
если вместо метода CopyHere, воспользоваться методом MoveHere, то фактически произойдет удаление... чистого метода удаления нет.




© OSzone.net 2001-2012