【问题标题】:Move all files in one FTP directory to another on same server using PowerShell使用 PowerShell 将一个 FTP 目录中的所有文件移动到同一服务器上的另一个目录
【发布时间】:2019-03-15 21:02:32
【问题描述】:

我想将位于“目录 A”中的所有文件移动到同一 FTP 服务器上的“目录 B”。

我搜索了这个网站并发现了一个类似的问题,但该解决方案对我不起作用,我无法发表评论,因为我的声誉低于 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"

注意:

有人可以帮忙解决一下吗,非常感谢您的知识。

【问题讨论】:

  • 我觉得应该是$ftprequest.RenameTo = "Backup"
  • 如果你的 FTP 主机上有 PowerShell,你可以Invoke-Command。您可以通过 SSH 向 FTP 主机发送命令吗?

标签: .net powershell ftp ftpwebrequest


【解决方案1】:

在 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 assembly,就这么简单:

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 的作者)

【讨论】:

  • @MartinPrikryl 感谢 WinSCP 以及这个出色的答案。这对于我递归移动的要求非常有用且非常容易修改!如果其他人需要移动各个子目录中的所有文件,则只能将::MatchDirectories 替换为::AllDirectories
猜你喜欢
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多