2015-02-10 57 views
1

我有这个脚本可以下载所有.txt和.log文件。但是我需要在下载后将它们移动到服务器上的另一个目录中。使用WinSCP .NET程序集下载后移动(不复制)远程文件

到目前为止,我打的时候老是喜欢错误,“不能动‘文件’到‘/文件’

try 
{ 
    # Load WinSCP .NET assembly 
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll" 

    # Setup session options 
    $sessionOptions = New-Object WinSCP.SessionOptions 
    $sessionOptions.Protocol = [WinSCP.Protocol]::ftp 
    $sessionOptions.HostName = "host" 
    $sessionOptions.PortNumber = "port" 
    $sessionOptions.UserName = "user" 
    $sessionOptions.Password = "pass" 

    $session = New-Object WinSCP.Session 

    try 
    { 
     # Connect 
     $session.DisableVersionCheck = "true" 
     $session.Open($sessionOptions) 

     $localPath = "C:\users\user\desktop\file" 
     $remotePath = "/" 
     $fileName = "*.txt" 
     $fileNamee = "*.log" 
     $remotePath2 = "/completed" 
     $directoryInfo = $session.ListDirectory($remotePath) 
     $directoryInfo = $session.ListDirectory($remotePath2) 

     # Download the file 
     $session.GetFiles(($remotePath + $fileName), $localPath).Check() 
     $session.GetFiles(($remotePath + $fileNamee), $localPath).Check() 

     $session.MoveFile(($remotePath + $fileName, $remotePath2)).Check() 
     $session.MoveFile(($remotePath + $fileNamee, $remotePath2)).Check() 

    } 
    finally 
    { 
     # Disconnect, clean up 
     $session.Dispose() 
    } 

    exit 0 
} 
catch [Exception] 
{ 
    Write-Host $_.Exception.Message 
    exit 1 
} 

回答

1

你在你的代码中的许多问题:


Session.MoveFiletargetPath说法我thod是移动/重命名文件的路径。

因此,如果您使用目标路径/complete,您正试图将文件移动到根文件夹并将其重命名为complete。虽然您可能想将文件移到文件夹/complete,并保留其名称。为此使用目标路径/complete/(或/complete/*使其更明显)。

您当前的代码失败,因为您正在将该文件重命名为已存在的文件夹的名称。


您实际上在.GetFiles中有相同的错误。您正在将所有文件(包括*.txt*.log)下载到文件夹C:\users\user\desktop并将它们全部保存为相同名称file,相互覆盖。


您的括号不正确地围绕两个参数,而不是仅围绕第一个参数。虽然我不是PowerShell专家,但我实际上已经说过,您完全没有这种方法的第二个参数。


而且,请注意,MoveFile方法不返回任何(违反GetFiles)。因此,没有任何对象可以调用.Check()方法。


MoveFile(注意是单数,相较于GetFiles),只移动一个文件。所以你不应该使用文件掩码。实际上,目前的实现允许使用文件掩码,但是这种使用没有记录,并且在将来的版本中可能会被弃用。

无论如何,最好的解决方案是迭代实际下载文件的列表,并由GetFiles返回并逐个移动文件。

通过这种方式可以避免竞争条件,您在其中下载文件集,添加新文件(您没有下载),并且不正确地将它们移动到“已完成”文件夹。


该代码应该看起来像(仅用于第一组文件,即在*.txt):

$remotePath2 = "/completed/" 

... 

$transferResult = $session.GetFiles(($remotePath + $fileName), $localPath) 
$transferResult.Check() 

foreach ($transfer in $transferResult.Transfers) 
{ 
    $session.MoveFile(($remotePath + $transfer.FileName), $remotePath2) 
} 

注意,这不包括在$localPath一个解决方法,因为我不知道,什么路径C:\users\user\desktop\file实际上的意思。


实际上,有提供一个非常相似的示例代码:
Moving local files to different location after successful upload

+0

我试过这个,它工作的很好,如果我离开“$ remotePath”,只有$ transferResult = $ session.GetFiles($ fileName,$ localPath),但自然它只是将文件复制到“已完成”文件夹而不是只是移动它们,但每当我尝试添加“$ remotePath + $ fileName”它什么都不做,甚至没有下载任何建议? – 2015-02-10 19:25:01

+0

ok,correc灰。我修正了一些我做错了的事情,所以它下载并移动“.txt”和“.log”文件夹内的文件,我怎样才能将整个文件夹移动到“已完成”文件夹?因为每天总会有新的东西,所以我想保持清洁并移动整个文件夹而不仅仅是其内容。 – 2015-02-10 19:34:53

+0

“文件夹”实际上是一种文件,所以只需在文件夹上调用'MoveFile',就像'$ session.MoveFile(“/ path/folder_to_move”,“/ another_path/folder_to_move_to /”)' – 2015-02-11 07:21:44

0

你检查,以确保您的进程有权将文件移动到新目录?

+0

不管我尝试属性来更改读或写的设置,我总是得到这个错误“SITE CHMOD‘XXX’/完成做 – 2015-02-10 17:09:56

相关问题