使用 PowerShell 中的 System.IO 访问 MTP 存储



我正在尝试访问MTP设备存储以自动执行文件复制,备份等。 如果 Windows 资源管理器能够打开和浏览 Android 设备内部存储和连接的 SD 卡,如何使用 PowerShell 访问这些存储?

我发现了很多提示,例如"获取设备 ID 并使用 WMI">

Windows资源管理器使用什么方式打开和浏览特别是Android的存储?

是否可以像这里这样使用一些 System.IO 类?

$drives = [System.IO.DriveInfo]::GetDrives()
$r = $drives | Where-Object { $_.DriveType -eq 'Removable' -and $_.IsReady }
if ($r) {
return @($r)[-1]
}

我能够通过以下方式访问和浏览本地MTP(安卓)设备的内容:

$WIAdialog = New-Object -ComObject “WIA.CommonDialog”
$Device = $WIAdialog.ShowSelectDevice()
$Device = $WIAdialog.ShowAcquireImage()
$Device = $WIAdialog.ShowAcquisitionWizard()
$Device = $WIAdialog.ShowDeviceProperties()
$Device = $WIAdialog.ShowItemProperties()
$Device = $WIAdialog.ShowPhotoPrintingWizard()
$Device = $WIAdialog.ShowSelectItems()
$Device = $WIAdialog.ShowTransfer()

但是此代码正在加载有关存储图片的信息,即使在本地计算机上也太慢了。是否可以避免加载有关图片的信息以加快加载和访问远程连接的设备?

提前感谢您提供任何信息和提示!

这是我关于Stack Overflow(Stack Exchange)的第一个答案,请考虑一下。

我正在处理同样的问题 - 我希望能够在PowerShell中使用Android内部存储,就像我在资源管理器中一样。 我唯一的建议是我们可以安装FTP服务器(我最喜欢的是FTP服务器) 并按这种方式排序。到目前为止,我在超级用户上找到的是这些答案:
打开命令提示符以访问USB连接的Android手机
的文件夹 13 票 & 接受

为了将驱动器号分配给可移动设备,该设备必须支持 UMS(USB 大容量存储)协议。不幸的是,大多数较新的Android手机,尤其是那些没有可移动SD卡的手机,不支持UMS。相反,它们支持 MTP(媒体传输协议)和 PTP(图片传输协议)协议。在此类设备中,无法将存储映射为 Windows 中的驱动器。

查看有关此 Superuser.com 问题的更多详细信息:如何在 Windows 中的命令行上访问 MTP 设备?

24 票 & 接受

不幸的是,MTP 公开的 API 与普通文件系统 API 有很大不同。因此,不可能将 MTP 设备公开为读/写文件系统。主要原因:

维基百科 说:

MTP 和 PTP 标准都不允许直接修改对象。相反,修改后的对象必须完整地重新上传,这对于大型对象可能需要很长时间。使用 PTP/MTP,必须在打开阶段知道文件大小。

您的通用文件复制程序只打开源文件和目标文件,并将数据块从源文件复制到目标文件。这不适用于 MTP,因为您需要使用 MTP 特殊函数,并且通用文件系统原语(读取、查找、写入)不可用。

还有其他限制。例如,可以在 MTP 设备上同时读取或写入的文件数量受到严格限制。该设备的行为根本不像文件系统。

我想MTP设备的只读文件系统驱动程序可能是可能的,但由于上述问题,它将几乎没有用处,因此没有人费心创建它。

编辑于 五月 12 '12 在 6:33 彼得·莫滕森 8,075

在10 '12 在 20:08 回答 海姆 15.9千米

只读文件系统驱动程序现在似乎存在: ptpdrive.com – Arne de Bruijn Sep 12 '13 在 12:25

ptpdrive.com

实际上,这不是"不可能"。当你考虑到我在 Linux 上将 gphotofs 和 mtpfs 作为完全读/写的 FUSE 文件系统时 - 很有可能在 Windows 下将其作为"驱动器号"完成......他们只是没有让它可用或容易。– 斯瓦塔夫 五月 9 '14 在 19:57

话虽如此,在某些选定的三星和索尼Android设备上,可以仅为外部存储(SD卡)启用UMS模式。 请参阅此应用程序 SG USB 大容量存储启用程序。

此外,如果您的目标是通过命令提示符简单地将文件复制到 Android 设备或从 Android 设备复制文件,ADB 将允许您这样做。此实用程序是Android SDK工具的一部分。您将需要安装Android手机的USB驱动程序,在手机上的开发人员设置中激活USB调试,并授权PC调试手机(通过设备上的提示)。完成后,您将能够使用adb pushadb pull命令来复制文件和目录,并通过adb shell <command>(例如adb shell ls /sdcard/)使用各种Linux shell命令来导航手机上的目录结构。

编辑 Mar 20 '17 在 10:18 社区♦
1
回答 Nov 21 '13 在 16:14
Chahk

18.5k

上面答案中提到的应用程序在我看来非常有限,因为它的年龄。

Function fn_PhoneFolder {
Param($PhoneName, $PhoneFolder)
Write-Host "Searching....$($PhoneName)" -ForegroundColor Green
$Shell = new-object -com Shell.Application
$ShellItem = $Shell.NameSpace(17).self #17 = My Computer (https://learn.microsoft.com/en-gb/windows/win32/api/shldisp/ne-shldisp-shellspecialfolderconstants?redirectedfrom=MSDN)
$Phone = $ShellItem.GetFolder.items() | where { $_.name -eq $PhoneName }
$FolderParts = @( $PhoneFolder.Split([system.io.path]::DirectorySeparatorChar) )
$PhonePath = $Phone
ForEach ($Part in $FolderParts) {
If ($Part) {
$PhonePath = $PhonePath.GetFolder.items() | where { $_.Name -eq $Part }
}
}
$ReturnFiles = New-Object System.Collections.Generic.List[System.Object]
$Files =  @($PhonePath.GetFolder.items())
$Files
ForEach ($File in $Files) {
$TempFiles = @{}
$TempFiles.Name = $File.Name
$TempFiles.Path = $File.Path
$TempFilesObject = New-Object PSobject -Property $TempFiles
$ReturnFiles.Add($TempFilesObject)
}
Return $ReturnFiles
}
$MyPhoneFiles = fn_PhoneFolder -PhoneName "X19" -PhoneFolder "Internal shared storageWhatsAppMediaWhatsApp ImagesSent"

更改最后一行的"电话名称"和"电话文件夹",以匹配"我的电脑"中显示的"电话名称"。此函数将拉回所选文件夹中所有文件的数组。感谢 https://blog.daiyanyingyu.uk/2018/03/20/powershell-mtp/搜索外壳文件夹以查找手机的想法。

相关内容

  • 没有找到相关文章

最新更新