我喜欢编写一个PowerShell脚本来从我的FTP服务器下载所有文件和子文件夹。我发现一个脚本可以从一个特定文件夹下载所有文件,但我也喜欢下载子文件夹及其文件。
#FTP Server Information - SET VARIABLES
$ftp = "ftp://ftp.abc.ch/"
$user = 'abc'
$pass = 'abc'
$folder = '/'
$target = "C:\LocalData\Powershell"
#SET CREDENTIALS
$credentials = new-object System.Net.NetworkCredential($user, $pass)
function Get-FtpDir ($url,$credentials) {
$request = [Net.WebRequest]::Create($url)
$request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory
if ($credentials) { $request.Credentials = $credentials }
$response = $request.GetResponse()
$reader = New-Object IO.StreamReader $response.GetResponseStream()
$reader.ReadToEnd()
$reader.Close()
$response.Close()
}
#SET FOLDER PATH
$folderPath= $ftp + "/" + $folder + "/"
$Allfiles=Get-FTPDir -url $folderPath -credentials $credentials
$files = ($Allfiles -split "`r`n")
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)
$counter = 0
foreach ($file in ($files | where {$_ -like "*.*"})){
$source=$folderPath + $file
$destination = Join-Path $target $file
$webclient.DownloadFile($source, $destination)
#PRINT FILE NAME AND COUNTER
$counter++
$counter
$source
}
谢谢你的帮助(:
2条答案
按热度按时间wlzqhblo1#
.NET framework或PowerShell没有任何对递归文件操作(包括下载)的显式支持。您必须自己实现递归:
棘手的部分是从子目录中识别文件。没有办法用.NET框架(
FtpWebRequest
或WebClient
)以可移植的方式做到这一点。不幸的是.NET框架不支持MLSD
命令,这是在FTP协议中检索具有文件属性的目录列表的唯一可移植方式。另请参阅Checking if object on FTP server is file or directory。您的选项包括:
LIST
command =ListDirectoryDetails
方法)并尝试解析特定于服务器的列表。许多FTP服务器使用 * nix样式的列表,其中您通过条目开头的d
来标识目录。但许多服务器使用不同的格式。下面的示例使用这种方法(假设为 *nix)使用如下函数:
代码是从我的C# Download all files and subdirectories through FTP中的C#示例转换而来的。
FtpWebRequest
for a new development *如果你想避免解析特定于服务器的目录列表格式的麻烦,请使用支持
MLSD
命令和/或解析各种LIST
列表格式的第三方库;和递归下载。例如,使用WinSCP .NET assembly,您可以通过对
Session.GetFiles
的单个调用下载整个目录:在内部,WinSCP使用
MLSD
命令,如果服务器支持。如果不支持,它使用LIST
命令,并支持数十种不同的列表格式。默认情况下,
Session.GetFiles
method是递归的。zbdgwd5y2#
通过PowerShell从FTP检索文件/文件夹我写了一些函数,你甚至可以从FTP隐藏的东西.
获取特定文件夹中的所有文件和子文件夹(即使是隐藏文件)的示例:
您可以直接从以下模块复制函数,而无需安装任何第三个库:https://github.com/AstralisSomnium/PowerShell-No-Library-Just-Functions/blob/master/FTPModule.ps1