shell32 copyhere在.Net和powershell脚本中都不起作用

时间:2016-11-23 09:10:07

标签: .net powershell mtp shell32 wpd

有一个powershell脚本通过MTP以编程方式在pc和android之间复制文件,请参阅access-file-system-against-mtp-connection,它在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:\ test \ Android \ test \

  

powershell ./mtpcp.ps1 c:\ test \ Android \ test \

它什么都不做(没有显示错误)。

然后我使用system.Shell32在.Net上实现了相同的功能,函数CopyHere与c:\之类的正常路径一起正常工作,但不能与mtp设备路径一起工作,就像powershell一样,它什么都不做在CopyHere函数上,既没有出现错误信息。

1 个答案:

答案 0 :(得分:0)

嗯......只需在copyhere之后添加一个sleep或readkey,然后它就能正常工作。

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();