PowerShell新手求助:FTP服务器按指定日期批量下载图片并记录文件名
批量从FTP下载指定日期的图片并记录文件名
没问题,我来帮你把单张下载的代码改成批量处理的版本,完美匹配你的需求——指定日期、下载所有对应图片、记录文件名到txt文件。
先给你完整的可直接使用的脚本,之后我会拆解关键部分帮你理解:
# 配置参数,根据你的实际情况修改 $UserName = "abc" $Password = "abc" $targetDate = "20201009" # 你要下载的日期字符串 $localSaveFolder = "C:\Users\Desktop\PowerShell\Downloads" # 本地保存文件夹 $ServerName = "10.196.195.167/22_test" $logFilePath = Join-Path $localSaveFolder "downloaded_files_$targetDate.txt" # 记录文件名的txt路径 # 确保本地保存文件夹存在,不存在则创建 if (-not (Test-Path $localSaveFolder)) { New-Item -ItemType Directory -Path $localSaveFolder | Out-Null } # 初始化WebClient对象并设置凭据 $webclient = New-Object System.Net.WebClient $webclient.Credentials = New-Object System.Net.NetworkCredential($UserName, $Password) try { # 获取FTP服务器上的文件列表 $ftpDirectoryUri = New-Object System.Uri("ftp://$ServerName/") $fileList = $webclient.DownloadString($ftpDirectoryUri) # 筛选出包含目标日期的图片文件(这里假设都是.jpg格式,可根据需要修改) $targetFiles = $fileList -split "`r`n" | Where-Object { $_ -match "_$targetDate_" -and $_ -like "*.jpg" } if ($targetFiles.Count -eq 0) { Write-Host "未找到包含日期 $targetDate 的图片文件" exit } Write-Host "找到 $($targetFiles.Count) 个待下载文件,开始下载..." # 循环下载每个文件,并记录文件名到txt foreach ($remoteFile in $targetFiles) { # 处理FTP列表中的文件名(有些FTP服务器返回的列表会包含额外信息,这里取最后一段) $cleanFileName = ($remoteFile -split "\s+")[-1] $localFilePath = Join-Path $localSaveFolder $cleanFileName $remoteUri = New-Object System.Uri("ftp://$ServerName/$cleanFileName") try { $webclient.DownloadFile($remoteUri, $localFilePath) Write-Host "已下载:$cleanFileName" # 将文件名追加到日志文件 Add-Content -Path $logFilePath -Value $cleanFileName } catch { Write-Host "下载失败:$cleanFileName,错误信息:$_" } } Write-Host "下载完成!文件名已记录到 $logFilePath" } catch { Write-Host "获取FTP文件列表失败,错误信息:$_" } finally { # 释放WebClient资源 $webclient.Dispose() }
关键部分解释:
- 参数配置:开头的变量都可以根据你的实际需求修改,比如目标日期、本地保存路径等,我都加了注释说明。
- 文件夹检查:脚本会自动创建本地保存文件夹,避免因为文件夹不存在导致下载失败。
- 获取FTP文件列表:通过
DownloadString方法获取FTP目录下的所有文件信息,然后筛选出包含指定日期的.jpg文件。 - 文件列表处理:有些FTP服务器返回的列表会包含文件大小、日期等额外信息,所以用
-split "\s+"分割后取最后一段作为纯文件名。 - 循环下载与日志记录:遍历每个目标文件,下载成功后就把文件名追加到txt文件里;如果下载失败会输出错误信息,不影响其他文件下载。
- 资源释放:最后用
Dispose()释放WebClient资源,养成良好的编程习惯。
使用注意事项:
- 请确保你的PowerShell有访问FTP服务器和本地文件夹的权限。
- 如果你的图片格式不是.jpg,可以修改
$_ -like "*.jpg"这部分,比如改成*.png或者去掉这个条件下载所有格式的文件。 - 如果FTP服务器返回的文件列表格式和脚本处理的不一样(比如有些服务器返回的格式不同),可能需要调整
$cleanFileName的处理逻辑,不过大部分标准FTP服务器都适用这个写法。
内容的提问来源于stack exchange,提问作者Aladin




