我尝试访问MTP设备存储以自动执行文件复制,备份等操作。 如果Windows资源管理器能够打开并浏览Android设备内部存储和连接的SD卡,我如何使用PowerShell访问这些存储?
I've found a lots of hints, such as "get device ID and use WMI"
Windows资源管理器用于打开和浏览特定Android存储的方式是什么?
Is it possible to use some System.IO Class like here?
$drives = [System.IO.DriveInfo]::GetDrives()
$r = $drives | Where-Object { $_.DriveType -eq 'Removable' -and $_.IsReady }
if ($r) {
return @($r)[-1]
}
我可以通过以下方式访问和浏览本地MTP(android)设备的内容:
$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()
但是此代码正在加载有关已存储图片的信息,即使在本地计算机上也是如此。是否可以避免加载有关图片的信息以加快加载和访问远程连接的设备?
提前感谢您提供任何信息和提示!
答案 0 :(得分:3)
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://docs.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 storage\WhatsApp\Media\WhatsApp Images\Sent"
在最后一行更改PhoneName和PhoneFolder以匹配“我的电脑”中显示的“电话名”。此功能将拉回所选文件夹中所有文件的数组。感谢https://blog.daiyanyingyu.uk/2018/03/20/powershell-mtp/提供了在Shell文件夹中搜索以查找电话的想法。
答案 1 :(得分:1)
这是我在Stack Overflow(Stack Exchange)上的第一个答案,请考虑一下。
我正在处理同样的问题 - 我希望能够在PowerShell中使用Android内部存储,就像我在资源管理器中一样。
我唯一的建议是我们可以安装FTP服务器(我最喜欢的是FTP Server)
并按这种方式排序。到目前为止我发现的是超级用户的这些答案:
Open command prompt to access folders of a USB connected Android phone
13票&接受
为了将驱动器号分配给可移动设备,该设备必须支持UMS(USB大容量存储)协议。不幸的是,大多数较新的Android手机,尤其是那些没有可移动SD卡的手机,都不支持UMS。相反,它们支持MTP(媒体传输协议)和PTP(图片传输协议)协议。在此类设备中,无法将存储映射为Windows中的驱动器。
详情请见此Superuser.com question: How do I access MTP devices on the command line in Windows?
24票&接受了
不幸的是,MTP公开的API与普通的文件系统API非常不同。因此,无法将MTP设备公开为读/写文件系统。主要原因是:
维基百科说:
MTP和PTP标准都不允许直接修改对象。相反,必须重新上载修改后的对象,这对于大型对象可能需要很长时间。使用PTP / MTP时,必须在开始阶段知道文件大小。
您的通用文件复制程序只打开源文件和目标文件,并将数据块从源文件复制到目标文件。这不适用于MTP,因为您需要使用MTP特殊功能,并且通用文件系统原语(读取,搜索,写入)不可用。
还有其他限制。例如,可以在MTP设备上同时读取或写入的文件数量受到严格限制。该设备的行为与文件系统不同。
我认为MTP设备的只读文件系统驱动程序可能是可能的,但由于上面列出的问题,它的用处很少,所以没有人愿意创建它。
于5月12日编辑,12月6日在12:33编辑 彼得莫特森 8075
1月10日和12月20日回答 haimg 15.9k
现在,只读文件系统驱动程序似乎存在:ptpdrive.com - Arne de Bruijn 9月12日和13日12:25
实际上,它不是"不可能"。如果你认为我已经将gphotofs和mtpfs作为Linux上的FUSE文件系统完全读/写 - 它的'很有可能做到这一点作为一个"驱动器号"在Windows下...他们只是没有提供或轻松。 - Svartalf 5月9日和14日19:57
据说,在一些选定的三星和索尼Android设备上,可以启用仅用于外部存储的UMS模式(SD卡)。 请参阅this app SG USB Mass Storage Enabler。
此外,如果您的目标是通过命令提示符简单地将文件复制到Android设备或从Android设备复制文件,则ADB将允许您这样做。此实用程序是Android SDK工具的一部分。您将需要安装Android手机的USB驱动程序,在手机的开发者设置中激活USB调试,并授权PC调试手机(通过设备上的提示。)完成后,您将能够使用adb push
和adb pull
命令复制文件&amp;目录和各种Linux shell命令通过adb shell <command>
(例如adb shell ls /sdcard/
)来导航手机上的目录结构。
于3月20日和17日在10月18日编辑
社区♦
1
11月21日和13日13:14回答
Chahk
18.5k
以上回答中提到的应用程序对我来说非常有限,因为它的年龄。