使用 PowerShell 将一个 FTP 目录中的所有文件移动到同一服务器上的另一个目录
Move all files in one FTP directory to another on same server using PowerShell
我想将 'Directory A' 中的所有文件移动到同一 FTP 服务器上的 'Directory 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"
注:
- 'Directory A' = ftp://ftp3.example.com/Jaz/In
- 'Directory B' = ftp://ftp3.example.com/Jaz/Backup
- All files to be moved are .txt format
- Full permissions have been granted to all files & folders on FTP
有人能帮忙解决一下吗,非常感谢你的知识。
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的作者)
我想将 'Directory A' 中的所有文件移动到同一 FTP 服务器上的 'Directory 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"
注:
- 'Directory A' = ftp://ftp3.example.com/Jaz/In
- 'Directory B' = ftp://ftp3.example.com/Jaz/Backup
- All files to be moved are .txt format
- Full permissions have been granted to all files & folders on FTP
有人能帮忙解决一下吗,非常感谢你的知识。
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的作者)