【发布时间】:2019-09-01 19:54:37
【问题描述】:
我希望能够将项目(文件、文件夹)从 Windows PC 复制到 MTP 设备。我想使用 PowerShell 来编写脚本。
我找到了这个帖子:shell32 copyhere not working neither in .Net nor powershell script,但那里的答案无助于理解解决方案(并且是由提出该问题的同一个人给出的)。下面是一个最小的代码示例:
param ($itemName)
$shell = New-Object -com Shell.Application
$sourceFolder = $shell.Namespace($(Get-Location).toString()).self
$item = $sourceFolder.GetFolder.Items() | where { $_.Name -eq $itemName }
$mtpDevice = $shell.NameSpace(0x11).items() | where { $_.name -eq 'DUMMY_MODEL' }
$destination = $mtpDevice.GetFolder.items() | where { $_.Name -eq 'Card' }
$destinationFolder=$shell.Namespace($destination).self
$destinationFolder.GetFolder.CopyHere($item)
$shell.open($destinationFolder)
Start-Sleep -s 1
我假设要复制的项目 ($itemName) 存在于 Windows 机器上。我假设 mtp 设备在 Windows 资源管理器中被视为“DUMMY_MODEL”,并且它包含一个空的顶级文件夹“Card”。
我希望这条线
$destinationFolder.GetFolder.CopyHere($item)
应该做的工作。但事实并非如此。为了让它工作,我需要以编程方式打开目标文件夹窗口并使用睡眠。为什么?上面提到的线程说它是为了让复制线程完成。为什么不打开窗户就不能完成?这可以在不以编程方式打开窗口的情况下完成吗?即使我打开窗口并进行睡眠,复制也不能 100% 可靠地工作。为什么?
【问题讨论】:
-
Here's another example 使用 Items() 集合进行可靠复制。就个人而言,我是 Beyond Compare 文件管理的粉丝。我每天在家和工作中使用它。版本 4 通过使用
mtp://[phone name]/Card语法支持 MTP。 -
Beyond Compare可以用于脚本和无人值守运行吗?可以不购买就永久使用(我的意思是合法使用)?
-
你提到的例子只做mtp->pc传输,但我有兴趣在相反的方向传输。
-
我更新了我的帖子,添加了一个更简单的脚本以适应您的需求。题外话:Beyond Compare 具有启动同步的命令行选项,但我对无人值守执行不是很熟悉,无法提供示例。它不是免费的,但它的价值远远超过我为永久许可证支付的 40 美元。
标签: windows powershell mtp