2015-02-10 85 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

相關問題