Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows 8 и 8.1 (http://forum.oszone.net/forumdisplay.php?f=116)
-   -   Как взаимодействовать с файлами на смартфоне, подключенном к компьютеру через USB? (http://forum.oszone.net/showthread.php?t=340088)

test009 12-04-2019 22:37 2867591

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

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



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



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



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



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

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

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

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

Iska 12-04-2019 22:48 2867594

Цитата:

Цитата test009
я не могу получить полный путь к файлам файловой системы смартфона из BAT-файла. »

А не факт, что он и есть. Возможно, пути существуют только в представлении Проводника. Скопируйте сюда полный путь из адресной строки.

yurfed 13-04-2019 01:22 2867596

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

YuS_2 13-04-2019 08:05 2867601

Цитата:

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

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

В Windows MTP не является файловой системой, а поддерживается на уровне прикладного ПО — поэтому «любимый файловый менеджер» не подойдёт.

test009 13-04-2019 15:08 2867623

Цитата:

А не факт, что он и есть. Возможно, пути существуют только в представлении Проводника. Скопируйте сюда полный путь из адресной строки.
ПУть такой:
Этот компьютер\ASUS_Z010DD\Внутр. накопитель



Цитата:

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

Iska 13-04-2019 19:33 2867652

Цитата:

Цитата test009
ПУть такой:
Этот компьютер\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 2867668


Iska 14-04-2019 01:08 2867674

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

YuS_2 14-04-2019 21:14 2867749

Цитата:

Цитата Iska
тут длинный путь, который на Вашем скриншоте приведён во второй-третьей-четвёртой строках… »

Это несколько зубодробительно получится...
Если говорить о 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 2867769

Цитата:

Цитата YuS_2
т.е. файловые операции будут проходить со всеми недостатками протокола 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 2867812

Цитата:

Цитата Iska
А напрямую нельзя — вместо перебора: »

Напрямую было бы можно, если получить заранее, тот самый зубодробительный путь, но где его взять? В этом вся сложность... рекурсии ведь не предоставляет MTP.
А перебором мы, как раз и получаем путь к конечному каталогу. Возможно, способ существует, но мне он не известен, увы...

test009 16-04-2019 11:25 2867956

Понял, попробую, спасибо.

YuS_2 16-04-2019 15:12 2867970

Цитата:

Цитата test009
попробую »

Тут, пока было время, состряпал двусторонний копировщик, может пригодится:
powershell
script.ps1
Код:

<#
        .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 2939039

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

(Windows7 x64, PSVersion 5.1.14409.1005 )

Цитата:

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

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

YuS_2 07-11-2020 19:45 2939050

Цитата:

Цитата Alexoner
Случайно не осталась версия где есть проверка наличия файлов на телефоне? »

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

Цитата:

Цитата Alexoner
Чтобы проверять, когда телефон хоть и подключён, но не разблокирован (то есть доступа нет). »

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

Цитата:

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

Неточно выразился, речь не про копирование, как таковое, а про файловые операции именно с файловой системой...
Media Transfer Protocol

YuS_2 08-11-2020 08:19 2939099

Цитата:

Цитата YuS_2
двусторонний копировщик »

Скрипт обновил, т.к. обнаружился баг...

Alexoner 08-11-2020 11:12 2939112

Цитата:

Цитата YuS_2
В смысле поиск файла? »

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

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

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

YuS_2 08-11-2020 11:50 2939116

Цитата:

Цитата Alexoner
проверка наличия пути ресурса. »

Для чего? powershell выдаст ошибку, если пути не существует.
Скрипт подключением управлять "не умеет", так что если ресурс существует, он выдаст то, что доступно, если ресурсы не доступны, будет выдана ошибка...
Цитата:

Цитата Alexoner
Проверить по хеш-сумме скопированные файлы с ресурсом. »

Что с чем сравнивать?
Цитата:

Цитата YuS_2
Дело в том, что никакой древовидной файловой структуры при работе с MTP, не существует, все действия осуществляются через созданный экземпляр COMObject, путем получения каждого элемента в отдельности, а они существуют только в виде родительского или дочернего (в случае если текущий элемент - каталог) элементов от текущего. »

Ни размер файла, ни его хешсуммы по MTP недоступны... все действия с файлами осуществляются самим устройством и его внутренним ПО. Почитайте информацию по ссылке, которую я привел...
Цитата:

Таким образом, плеер, подключившийся как флэш-диск, полностью доверяется компьютеру; подключившийся по MTP — самостоятельно отвечает за хранение и целостность данных
т.е. если файл копируется битым, то ни скрипт, ни компьютер не могут с этим ничего поделать, за это отвечает сам смартфон, то бишь его аппаратно-программная часть, которая работает с внутренними ресурсами устройства.

Alexoner 08-11-2020 12:25 2939120

Цитата:

Цитата YuS_2
Для чего? powershell выдаст ошибку »

Чтобы избежать выдачи красной ошибки. Наверное её как-то отлавливать можно. Надо изучить этот вопрос.

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

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

YuS_2 08-11-2020 15:43 2939150

Цитата:

Цитата Alexoner
Чтобы избежать выдачи красной ошибки. »

так это показатель того, что присутствует ошибка и даже расшифровка есть. Зачем подавлять сообщение? Оно ничем не мешает работе.

Цитата:

Цитата Alexoner
Выходит для проверки нужна проверочная программа установленная в телефоне »

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

Цитата:

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

если вместо метода CopyHere, воспользоваться методом MoveHere, то фактически произойдет удаление... чистого метода удаления нет.

Alexoner 08-11-2020 17:35 2939160

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

Цитата:

Цитата YuS_2
Проще подключить устройство по сетке Wi-Fi и управлять файлами в самом устройстве »

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

Iska 08-11-2020 17:53 2939164

Цитата:

Цитата YuS_2
чистого метода удаления нет. »

Разве нет там для папок и файлов глагола «&Удалить» для соответствующих объектов класса 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




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

YuS_2 08-11-2020 18:57 2939172

Цитата:

Цитата Alexoner
А переименовывать папку в телефоне через MTP можно? »

Переименовать - нет, можно перенести или создать...
Цитата:

Цитата Alexoner
Не подскажете где лучше почитать инфу про это? »

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

Цитата:

Цитата Iska
Разве нет там для папок и файлов глагола «&Удалить» для соответствующих объектов класса FolderItem? »

Увы и ах... все методы, которые доступны:

Alexoner 08-11-2020 20:06 2939180

Цитата:

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

Просто хотел скрипт сделать, чтобы он делал всё "в одно нажатие" и чтобы не зависеть от сторонних программ. Сначала CMD поизучал, а потом на PS перешёл. Так что я везде новичок.
А в VBS функционала больше получается в этом плане?

Iska 08-11-2020 20:10 2939181

YuS_2, это не метод, это глагол, Verb. Метод .Verbs класса FolderItem, возвращает коллекцию FolderItemVerbs.

Надо бы ещё попробовать удалить этим способом. И это:
Цитата:

Цитата YuS_2
Переименовать - нет »

тож.

Цитата:

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

Ругани много в отзывах, что типа работает, увы, через пень-колоду и не везде.


Цитата:

Цитата Alexoner
А в VBS функционала больше получается в этом плане? »

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

YuS_2 08-11-2020 21:40 2939197

Цитата:

Цитата Iska
это не метод, это глагол, Verb. Метод .Verbs класса FolderItem, возвращает коллекцию FolderItemVerbs. »

А, вон про что речь... да, powershell .Verbs понимает именно, как метод:

- да, такой список присутствует. Ведь это метод работы powershell с WSH, всё же, в итоге... другое дело, что я не знаю, что с этим делать дальше, т.е. требуется пинок в этом направлении... :)
По сути, мы получаем объект System.MarshalByRefObject, но лично мне, это ни о чем, пока... надо углублять знания...

Цитата:

Цитата Iska
Ругани много в отзывах, что типа работает, увы, через пень-колоду и не везде. »

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

Цитата:

Цитата Iska
Но в данном случае что WSH, что PoSH пользуют одно и то же средство — объект Automation «Shell.Application» »

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

YuS_2 08-11-2020 22:56 2939208

Цитата:

Цитата Iska
Разве нет там для папок и файлов глагола «&Удалить» для соответствующих объектов класса FolderItem? »

Цитата:

Цитата YuS_2
другое дело, что я не знаю, что с этим делать дальше, т.е. требуется пинок в этом направлении... »

после чтения мануалов, ситуация прояснилась
Глаголы эти формируют контекстное меню проводника.
В 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 2939364

Цитата:

Цитата YuS_2
если удаление, то с подтверждением... »

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

Цитата:

Цитата YuS_2
если вместо метода CopyHere, воспользоваться методом MoveHere, то фактически произойдет удаление... »

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

Цитата:

Цитата YuS_2
(например, Переи&меновать - 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 2939374

Цитата:

Цитата Iska
Когда-то с коллегами игрались в эти игрушки. »

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

Цитата:

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

Понятно, спасибо...

Alexoner 15-11-2020 18:00 2940045

Вложений: 1
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 2940066

Цитата:

Цитата Alexoner
Есть ли способ как-то обойти подтверждение? »

Это особенности использования MTP протокола. Обойти - никак. Подтверждать автоматом - не знаю, может кликером каким... но не использовал никогда, не подскажу.

Iska 15-11-2020 21:16 2940078

Желающие могут на свой страх и риск поиграться с этим: windows 7 - Disable prompt to convert videos copied to media device - Super User. Я — нет.

Alexoner 20-11-2020 15:26 2940510

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 2940789

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 2940791

Цитата:

Цитата Alexoner
Можно ли как-то подставлять параметр "-from" или "-to" с помощью переменной? »

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

Alexoner 23-11-2020 15:37 2940800

Цитата:

Цитата YuS_2
Подставлять куда? »

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

Carrio 24-09-2024 22:11 3031084

YuS_2
Спасибо за скрипт!

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

YuS_2 25-09-2024 09:50 3031092

Цитата:

Цитата Carrio
Может есть способ заставить его ждать полного копирования файла в обоих направлениях? »

Скриптом это никак не регулируется.
Цитата:

Цитата YuS_2
все действия с файлами осуществляются самим устройством и его внутренним ПО. »


Carrio 25-09-2024 10:36 3031095

Цитата:

Цитата YuS_2
Скриптом это никак не регулируется. »

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

Просто и для from и для to, по сути используется одна и та же конструкция:
Код:

getfolder.copyhere($item)

YuS_2 25-09-2024 11:40 3031096

Цитата:

Цитата Carrio
Но всё-таки что именно заставляет PowerShell ждать полного завершения процесса копирования ИЗ смартфона? »

Заставляет ожидать транзакционную операцию получения файла, после чего уже именно средствами powershell-а будет происходить файловая операция, с файловой системой именно... А при отправке файлов на устройство, powershell уже не заботится о целостности записи и хранения, всё "ложится на плечи" самого устройства и его ПО. Если Вас интересуют тонкости работы протокола MTP, то необходимо читать по нему документацию. У меня нет ни времени, ни желания освежать в памяти эту не особо нужную информацию, уж извините :)

Carrio 25-09-2024 21:39 3031109

YuS_2
Теперь понятно, спасибо!

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

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


Время: 16:36.

Время: 16:36.
© OSzone.net 2001-