2016-11-23 70 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