Crazy
Сообщения: 1186
Благодарности: 497
|
Профиль
|
Отправить PM
| Цитировать
Тут, пока было время, состряпал двусторонний копировщик, может пригодится:
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
}
|
-------
scio me nihil scire. Ѫ
Последний раз редактировалось YuS_2, 08-11-2020 в 19:08.
Причина: обновление скрипта 08.11.20
Отправлено: 15:12, 16-04-2019
| #13
|