2016-11-23 73 views
1

有一个PowerShell脚本通过编程方式通过MTP在PC和Android之间复制文件,请参阅access-file-system-against-mtp-connection,它在PowerShell控制台下运行时工作,然后我创建了一个脚本作为如下:shell32 copyhere在.Net和PowerShell脚本中都不工作

function Usage() 
{ 
    echo "Usage:mtpcmd cp srcfile dstfolder" 
} 
function main 
{ 
    param($mainargs) 
# echo "args2:$mainargs" 
    if(-not($mainargs.length -eq 2)) 
    { 
     Usage 
     return 
    } 
    $srcfile=$mainargs[0] 
    $dstfolder=$mainargs[1] 

    $phone = Get-ChildShellItem | where { $_.Path -like '*usb*' } 
    echo "phonePath:$($phone.Path)" 
    Copy-ShellItem -Path "$srcfile" -Destination "$($phone.Path)\内部存储$dstfolder" 
} 
#echo "args1:$args" 
main -mainargs $args 

这个脚本工作的PowerShell的控制台上运行的罚款,但是当我运行CMD下像

PowerShell的-files mtpcp.ps1 C:\测试\ Android的\测试\

PowerShell的./mtpcp.ps1 C:\测试\ Android的\测试\

它只是什么也不做(没有显示错误)。

然后我使用system.Shell32实现了.Net上的相同函数,函数CopyHere可以正常工作,像c:\这样的regulare路径,但不能用于mtp设备路径,就像powershell一样,它只是对CopyHere函数不做任何操作,既不显示错误消息。

回答

0

好吧...只需在copyhere后添加一个睡眠或读写键,然后它就能正常工作。

Shell sh = new Shell(); 
Folder folder = sh.NameSpace(AndroidMTPFiles.GetUsbFolderItem().Path + @"\内部存储\Android\test"); 
//FolderItem fi = AndroidMTPFiles.GetRegularFileItemByPath(@"c:\test\src"); 
folder.CopyHere(@"c:\test\src\",16); 
sh.Open(folder); 
System.Console.ReadKey(); 
+0

导致复制线程在您的进程上工作,所以你必须等到复制线程完成。 – coder