PDA

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


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

Alexoner
08-11-2020, 17:35
YuS_2,
Благодарю за информацию.
А переименовывать папку в телефоне через MTP можно? То есть, при копировании с ПК на телефон там уже есть старая папка с файлами, её переименовать, чтобы залить новую...
Хотя наверно проще будет имя новой папки чуть поменять и тогда уже закидывать.

Проще подключить устройство по сетке Wi-Fi и управлять файлами в самом устройстве »
Даже как-то не задумывался об этом. Не подскажете где лучше почитать инфу про это?

Iska
08-11-2020, 17:53
чистого метода удаления нет. »
Разве нет там для папок и файлов глагола «&Удалить» для соответствующих объектов класса FolderItem? У меня есть:
Option Explicit

Dim objShell

Dim objFolderItem, objFolderItem2
Dim objVerb


Set objShell = WScript.CreateObject("Shell.Application")

For Each objFolderItem In objShell.NameSpace(&H11).Items
WScript.Echo "[" & objFolderItem.Name & "]"

If StrComp(objFolderItem.Name, "Redmi Note 4", vbTextCompare) = 0 Then
For Each objFolderItem2 In objFolderItem.GetFolder.Items
WScript.Echo vbTab & "[" & objFolderItem2.Name & "]"

If StrComp(objFolderItem2.Name, "Внутренний общий накопитель", vbTextCompare) = 0 Then
With objFolderItem2.GetFolder.ParseName("Sample")
WScript.Echo vbTab & vbTab & "[" & .Name & "]"

With .GetFolder
With .ParseName("SampleFolder")
WScript.Echo vbTab & vbTab & vbTab & "[" & .Name & "]"

For Each objVerb In .Verbs
If StrComp(objVerb.Name, "&Удалить", vbTextCompare) = 0 Then
WScript.Echo vbTab & vbTab & vbTab & vbTab & "[" & objVerb.Name & "]"
'objVerb.DoIt

Exit For
End If
Next
End With

With .ParseName("Sample.txt")
WScript.Echo vbTab & vbTab & vbTab & "[" & .Name & "]"

For Each objVerb In .Verbs
If StrComp(objVerb.Name, "&Удалить", vbTextCompare) = 0 Then
WScript.Echo vbTab & vbTab & vbTab & vbTab & "[" & objVerb.Name & "]"
'objVerb.DoIt

Exit For
End If
Next
End With
End With
End With

Exit For
End If
Next

Exit For
End If
Next

Set objShell = Nothing

WScript.Quit

https://i.imgur.com/bEh7xbT.png


Alexoner, с такими запросами проще взять Far Manager с плагином PortaDev и делать всё «ручками».

YuS_2
08-11-2020, 18:57
А переименовывать папку в телефоне через MTP можно? »
Переименовать - нет, можно перенести или создать...
Не подскажете где лучше почитать инфу про это? »
Почитать - не знаю. Но самый простой вариант: установить Total Commander из плеймаркета, а также плагин к нему LAN, на компьютере расшарить каталог и получить к нему доступ из тотала, после подключения смарта к сети Wi-Fi. В принципе, есть разные файловые менеджеры, умеющие подобное, например X-plore и т.п.
Также можно установить total commander для ПК и через него управлять файлами на смарте...

Разве нет там для папок и файлов глагола «&Удалить» для соответствующих объектов класса FolderItem? »
Увы и ах... все методы, которые доступны:
http://ipic.su/img/img7/tn/2020-11-821-54-36.1604850927.png (http://ipic.su/img/img7/fs/2020-11-821-54-36.1604850927.png)

Alexoner
08-11-2020, 20:06
Alexoner, с такими запросами проще взять Far Manager с плагином PortaDev и делать всё «ручками». »
Просто хотел скрипт сделать, чтобы он делал всё "в одно нажатие" и чтобы не зависеть от сторонних программ. Сначала CMD поизучал, а потом на PS перешёл. Так что я везде новичок.
А в VBS функционала больше получается в этом плане?

Iska
08-11-2020, 20:10
YuS_2, это не метод, это глагол, Verb. Метод .Verbs класса FolderItem, возвращает коллекцию FolderItemVerbs.

Надо бы ещё попробовать удалить этим способом. И это:
Переименовать - нет »
тож.

Но самый простой вариант: установить Total Commander из плеймаркета, а также плагин к нему LAN, на компьютере расшарить каталог и получить к нему доступ из тотала, после подключения смарта к сети Wi-Fi. »
Ругани много в отзывах, что типа работает, увы, через пень-колоду и не везде.

А в VBS функционала больше получается в этом плане? »
Меньше. Но в данном случае что WSH, что PoSH пользуют одно и то же средство — объект Automation «Shell.Application», COM-объект Проводника.

YuS_2
08-11-2020, 21:40
это не метод, это глагол, Verb. Метод .Verbs класса FolderItem, возвращает коллекцию FolderItemVerbs. »
А, вон про что речь... да, powershell .Verbs понимает именно, как метод:
http://ipic.su/img/img7/tn/2020-11-90-16-19.1604859417.png (http://ipic.su/img/img7/fs/2020-11-90-16-19.1604859417.png)
- да, такой список присутствует. Ведь это метод работы powershell с WSH, всё же, в итоге... другое дело, что я не знаю, что с этим делать дальше, т.е. требуется пинок в этом направлении... :)
По сути, мы получаем объект System.MarshalByRefObject, но лично мне, это ни о чем, пока... надо углублять знания...

Ругани много в отзывах, что типа работает, увы, через пень-колоду и не везде. »
Ну, не знаю, я пользуюсь, особо серьёзных багов не замечал, на многих устройствах с андроидом использовал... а неработоспособность (тут бы уточнение не помешало, что имеется в виду конкретно), скорее связана с особенностями самого Android и его файловой системой, т.к. параллельно есть ещё и X-plore и если где-то появляется затык, то он проявляется в обоих менеджерах, как правило...

Но в данном случае что WSH, что PoSH пользуют одно и то же средство — объект Automation «Shell.Application» »
угу, именно так...
Только я бы сказал, что здесь powershell использует средство автоматизации: объект Application оболочки Windows, также как и скрипт vbs (через WSH)... сути это конечно не изменит, но так точнее (это мое природное занудство говорит :) )

YuS_2
08-11-2020, 22:56
Разве нет там для папок и файлов глагола «&Удалить» для соответствующих объектов класса FolderItem? »
другое дело, что я не знаю, что с этим делать дальше, т.е. требуется пинок в этом направлении... »
после чтения мануалов, ситуация прояснилась
Глаголы эти формируют контекстное меню проводника.
В powershell их можно задействовать, хоть и не все (например, Переи&меновать - OperationStopped: The method or operation is not implemented.).
Примерно так:
...
$item = $items|? isfolder -eq $true
$item.verbs().item(6).doit()
Вот только, действие у них соответствующее: если свойства, то результат в окне, а не в консоли, если удаление, то с подтверждением... т.е. для автоматизации они не годятся, увы.

Iska
10-11-2020, 02:19
если удаление, то с подтверждением... »
Когда-то с коллегами игрались в эти игрушки. Выяснилось, что для обычной файловой системы вполне работает следующее: предварительное отключение подтверждения удаления (через реестр), вызов глагола &Удалить, обратное включение подтверждения удаления. Но! При работе с эмулируемой файловой системой — в тот раз это была тогдашняя ипостась «Сжатая папка» (реализуемая идущей в комплекте библиотекой zipfldr.dll) — чихать Shell.Application хотел на ряд вроде бы задокументированных моментов, в том числе и на отключение подтверждения удаления. Я не проверял, но есть большое подозрение, что ровно то же может случиться и с файловой системой, эмулируемой посредством протокола MTP.

если вместо метода CopyHere, воспользоваться методом MoveHere, то фактически произойдет удаление... »
Кажись, и с таким игрались. Деталей не упомню за давностью лет. Вспомнил: да, сначала получаем объект Корзины, а затем исполняем для него .MoveHere().

(например, Переи&меновать - OperationStopped: The method or operation is not implemented.). »
Переименование банальное: FolderItem.Name = "bla-bla-bla", главное — помнить, что для переименовывания папки нужно использовать не сам объект Folder, а его родительский объект FolderItem — Folder.Parent.Name = "New folder name"

YuS_2
10-11-2020, 09:20
Когда-то с коллегами игрались в эти игрушки. »
Согласен. В таком виде, как они существуют сейчас, это не более чем игрушки... а решения относительно powershell, больше похожи на костыли.
В итоге, мне показалось, что овчинка не стоит выделки, т.к. есть вполне реализованные программы, для работы с файловой системой устройств, а писать калечный дубликат - не хочется.
В общем, плюнул я на все эти MTP и не стал голову забивать себе... :)

для переименовывания папки нужно использовать не сам объект Folder, а его родительский объект FolderItem — Folder.Parent.Name = "New folder name" »
Понятно, спасибо...

Alexoner
15-11-2020, 18:00
YuS_2,
Приветствую.

Попробовал через скрипт скопировать десяток файлов с ПК на телефон. Половина скопировалось, а половина запросила подтверждение.
Есть ли способ как-то обойти подтверждение?
Или может как-то автоматически подтверждать копирование?

PSVersion 5.1.14409.1005
Windows 7 x64
Samsung Galaxy Note 3
Android 4.4.2

$phone = "Note 3"
$sour = "C:\testPS\Copy To SGN3"
$dest = "Card\Test"

.\MTP2.ps1 -phone $phone `
-sour $sour `
-dest $dest -to

YuS_2
15-11-2020, 20:52
Есть ли способ как-то обойти подтверждение? »
Это особенности использования MTP протокола. Обойти - никак. Подтверждать автоматом - не знаю, может кликером каким... но не использовал никогда, не подскажу.

Iska
15-11-2020, 21:16
Желающие могут на свой страх и риск поиграться с этим: windows 7 - Disable prompt to convert videos copied to media device - Super User (https://superuser.com/questions/402225/disable-prompt-to-convert-videos-copied-to-media-device). Я — нет.

Alexoner
20-11-2020, 15:26
YuS_2, В функцию "get-folder" добавил проверку на блокировку подключённого девайса, чтобы не появлялись красные строки. Возможно будет полезна в скрипте.


function get-folder ($paths){
$cur = $root

# Проверка на блокировку девайса.
$checkDirPhone = $cur.getfolder.items()
IF ($checkDirPhone.count -EQ 0) {

Write-Host 'Директория пуста. Возможно устройство не разблокировано.' -for Yellow
RETURN 'BlockDevice'
}

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

Alexoner
23-11-2020, 13:03
YuS_2, Можно ли как-то подставлять параметр "-from" или "-to" с помощью переменной?


MTPConnect `
-phone $phone `
-sour $sour `
-dest $folderName `
-from


# Такой вариант не срабатывает:

$test = "-from"

MTPConnect `
-phone $phone `
-sour $sour `
-dest $folderName `
$test

YuS_2
23-11-2020, 13:31
Можно ли как-то подставлять параметр "-from" или "-to" с помощью переменной? »
Подставлять куда?
From и To - это переключатели, которые задают значение соответствующих переменных $from и $to, которые, в свою очередь, имеют булевый тип, либо $false, либо $true.
По умолчанию, если ключи не указаны, обе переменные имеют значение False, если же указать один из ключей, то одна из соответствующих переменных будет иметь значение True. Одновременно, две переменные не могут иметь значение True.

Alexoner
23-11-2020, 15:37
Подставлять куда? »

Чтобы управлять ключами на расстоянии (в начале скрипта). Подставлять их как в функциях с помощью переменных, при работе в цикле. То есть один запуск модуля с ключом, другой без ключа. Ну и ещё хотел добавить ещё ключ, который тоже выполняет переключение внутри, но передать его походу так нельзя.
(Например: если есть ключ -cls, то подставить Movehere.)

Carrio
24-09-2024, 22:11
YuS_2
Спасибо за скрипт!

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

YuS_2
25-09-2024, 09:50
Может есть способ заставить его ждать полного копирования файла в обоих направлениях? »
Скриптом это никак не регулируется.
все действия с файлами осуществляются самим устройством и его внутренним ПО. »

Carrio
25-09-2024, 10:36
Скриптом это никак не регулируется. »
Но всё-таки что именно заставляет PowerShell ждать полного завершения процесса копирования ИЗ смартфона? Тогда как при копировании В смартфон PowerShell не ждёт, а сразу начинает отрабатывать следующие строки кода. Хотелось бы понять эту логику. Если она вообще есть :)

Просто и для from и для to, по сути используется одна и та же конструкция:
getfolder.copyhere($item)

YuS_2
25-09-2024, 11:40
Но всё-таки что именно заставляет PowerShell ждать полного завершения процесса копирования ИЗ смартфона? »
Заставляет ожидать транзакционную операцию получения файла, после чего уже именно средствами powershell-а будет происходить файловая операция, с файловой системой именно... А при отправке файлов на устройство, powershell уже не заботится о целостности записи и хранения, всё "ложится на плечи" самого устройства и его ПО. Если Вас интересуют тонкости работы протокола MTP, то необходимо читать по нему документацию. У меня нет ни времени, ни желания освежать в памяти эту не особо нужную информацию, уж извините :)




© OSzone.net 2001-2012