Переместить все файлы из одного каталога FTP в другой на одном сервере с помощью PowerShell - PullRequest
0 голосов
/ 11 октября 2018

Я хочу переместить все файлы, расположенные в «Каталоге A», в «Каталог B» на том же FTP-сервере.

Я искал этот сайт и нашел похожий вопрос, но решение не помогло мнеи я не могу комментировать, так как моя репутация меньше 50.

В приведенном ниже коде показано, что я пробовал до сих пор;

$Source = "ftp://ftp3.example.com/Jaz/In/" 
$user = 'username' 
$pass = 'password'

$credentials = new-object System.Net.NetworkCredential($user, $pass)

$ftprequest = [System.Net.FtpWebRequest]::create($Source)
$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::Rename   
$ftprequest.RenameTo = "ftp://ftp3.example.com/Jaz/Backup"

Примечание:

Может кто-нибудь помочь с решением, ваши знания очень ценятся.

1 Ответ

0 голосов
/ 11 октября 2018

В PowerShell или .NET нет поддержки пакетных или рекурсивных операций FTP (например, перемещение всех файлов из каталога в другую).

Если вы хотите использовать чистый PowerShell, вам нужно переместить файлы по одному.на один.

$source = "ftp://ftp.example.com/source/path/" 
$dest = "/dest/path/"

$credentials = new-object System.Net.NetworkCredential("username", "password")

Write-Host "Listing files..."

$listRequest = [System.Net.FtpWebRequest]::Create($source)
$listRequest.Credentials = $credentials
$listRequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory

$files = New-Object System.Collections.ArrayList

$listResponse = $listRequest.GetResponse()
$listStream = $listResponse.GetResponseStream()
$listReader = New-Object System.IO.StreamReader($listStream)
while (!$listReader.EndOfStream)
{
    $file = $listReader.ReadLine()
    $files.Add($file) | Out-Null
}
$listReader.Dispose()
$listStream.Dispose()
$listResponse.Dispose()

foreach ($file in $files)
{
    Write-Host "Renaming $file..."
    $renameRequest = [System.Net.FtpWebRequest]::Create($source + $file)
    $renameRequest.Credentials = $credentials
    $renameRequest.Method = [System.Net.WebRequestMethods+Ftp]::Rename
    $renameRequest.RenameTo = $dest + $file
    $renameRequest.GetResponse().Dispose()
}

Приведенный выше код переместит все записи в каталоге (файлы или подпапки).

Другие проблемы в вашем коде (исправлено в моем):

  • Вы никогда не используете $credentials
  • RenameTo только путь, а не URL.

Код был бы намного проще с лучшим FTPклиент.

Например, с сборкой WinSCP .NET , это так же просто, как:

Add-Type -Path "WinSCPnet.dll"

$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Ftp
    HostName = "ftp.example.com"
    UserName = "username"
    Password = "password"
}

$session = New-Object WinSCP.Session
$session.Open($sessionOptions)

$source = "/source/path" 
$dest = "/dest/path"

$files = $session.EnumerateRemoteFiles(
             $source, $Null, [WinSCP.EnumerationOptions]::MatchDirectories)
foreach ($file in $files)
{
    Write-Host "Renaming $file..."
    $session.MoveFile($file.FullName, [WinSCP.RemotePath]::Combine($dest, $file.Name))
}

(я автор WinSCP)

...