В 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)