从Web文件服务器的“索引”页面下载所有文件的简单工具
介绍
一个简单的 PowerShell 脚本,用于从“索引”页以递归方式下载所有文件
仅限下载WEB页面的文件服务器内的文件
仅限英文命名的文件(中文命名的文件下载下来也会变成乱码文件名)
仅限Windows系统上运行
需求
###复制来源:项目介绍。###
我偶尔会发现自己与朋友和家人共享我托管在私人网络服务器上的大文件。
由于我通常将非常大的文件分成多个部分,我希望他们能够轻松下载多个文件,而无需获取其他软件或知道如何使用它(例如或 JDownloader)wget)
这恰恰做到了这一点,同时又是用户友好的。
用户会收到 WinForms GUI 提示,以输入 URL 和下载位置。 之后,下载开始并显示进度指示器。
现在我可以给他们这个脚本,并带有下载位置的 URL,瞧:对我或他们来说都没有麻烦!:)
使用教程
使用环境
Windows11上面打不开
Windows Server 2012上无法弹出手动选择保存路径选项。
Windows 10 :自行测试
官方动图使用教程
动图教程
下载所需文件
前往GitHub下载最新版本的脚本文件
IndexOfDownloader.ps1
文件下载地址 https://github.com/lazaroblanc/Index-of-downloader/releases
下载wget程序(选择你系统对应的版本)
文件下载地址 https://eternallybored.org/misc/wget/
将下载的两个文件放在同一个文件夹内,文件夹路径不要有中文。
批量下载文件
点击
IndexOfDownloader.ps1
脚本文件,右键选择使用PowerShell运行。输入
Y
确定在框内粘贴你想下载的文件服务器某文件夹内文件的文件夹路径,然后点击确定。
(注意:下载地址最后面要加/
符号,表示下载当前路径下的所有文件。)#演示使用作者演示使用的地址 https://dserver.bundestag.de/btd/17/CD14600/Dokumente/
脚本会自动执行命令,测试时脚本无法调用文件资源管理器,所以无法选择路径,默认下载的文件都会存储在脚本所在的文件夹内。
文件下载完毕之后直接关闭Windows PoweShell窗口就行。文件全部下载完毕。
脚本解析
脚本命令(有看得懂的可以自行修改)
[CmdletBinding()] param ( $Url, $Path ) Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName Microsoft.VisualBasic # Prompt for Url if (-not $Url) { $title = '"Index of" downloader' $msg = "Please enter URL" $Url = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title, "https://...") } "Url: $Url" | Write-Verbose if ($Url.length -eq 0) { exit } if (-not [Uri]::IsWellFormedUriString($Url, 1)) { "Malformed Url" | Write-Error exit } $NoOfDirsToCut = ([Uri]$Url).Segments.Count - 1 $wgetParams = @( "--no-check-certificate" "--recursive" "--no-clobber" "--no-parent" "--no-host-directories" "--cut-dirs=$NoOfDirsToCut" "--quiet" "--show-progress" "--restrict-file-names=ascii" # mode "nocontrol" unfortunately does not work on Windows so UTF-8 filenames are not possible atm :( "--local-encoding=utf-8" ) try { $statusCode = (Invoke-WebRequest -Uri $Url -ErrorAction Stop).StatusCode } catch { $statusCode = [int]$_.Exception.Response.StatusCode; $_ | Write-Error } while ($statusCode -eq 401) { $creds = Get-Credential -Message "401 - The website requires a username/password" if ($null -eq $creds) { exit } try { $statusCode = (Invoke-WebRequest -Uri $Url -Credential $creds -ErrorAction Stop).StatusCode $creds = New-Object psobject -Property @{"user" = $creds.UserName; "password" = $creds.GetNetworkCredential().password } $wgetParams += "--http-user=$($creds.user)" $wgetParams += "--http-password=$($creds.password)" } catch { $_ | Write-Error } } # Prompt for download location if (-not $Path) { $folderBrowseDialog = [System.Windows.Forms.FolderBrowserDialog]::new() $folderBrowseDialog.Description = "Select download directory`n`nDownloadverzeichnis auswählen" $buttonPressed = $folderBrowseDialog.ShowDialog() if ($buttonPressed -eq "Cancel") { exit } Set-Location $folderBrowseDialog.SelectedPath } else { Set-Location $Path } "Path: $(Get-Location)" | Write-Verbose # Only download wget if not already found on system $wget = ".\wget.exe" if (-not (Test-Path "$wget" -ErrorAction SilentlyContinue)) { if ([Environment]::Is64BitOperatingSystem) { $architecture = "64" } else { $architecture = "32" } "Downloading wget" | Write-Verbose Invoke-WebRequest -Uri "https://eternallybored.org/misc/wget/1.20.3/$architecture/wget.exe" -OutFile ".\$wget" $cleanupWget = $true } "Running wget" | Write-Verbose & $wget $wgetParams --execute robots=off --reject index.htm* $Url if ($cleanupWget) { $wget | Remove-Item } Read-Host "Press any key to exit" exit
项目地址
👇👇👇
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果