介绍

  • 一个简单的 PowerShell 脚本,用于从“索引”页以递归方式下载所有文件

  • 仅限下载WEB页面的文件服务器内的文件

  • 仅限英文命名的文件(中文命名的文件下载下来也会变成乱码文件名)

  • 仅限Windows系统上运行

需求

  • ###复制来源:项目介绍。###

  • 我偶尔会发现自己与朋友和家人共享我托管在私人网络服务器上的大文件。

  • 由于我通常将非常大的文件分成多个部分,我希望他们能够轻松下载多个文件,而无需获取其他软件或知道如何使用它(例如或 JDownloader)wget)

  • 这恰恰做到了这一点,同时又是用户友好的。

  • 用户会收到 WinForms GUI 提示,以输入 URL 和下载位置。 之后,下载开始并显示进度指示器。

  • 现在我可以给他们这个脚本,并带有下载位置的 URL,瞧:对我或他们来说都没有麻烦!:)

使用教程

使用环境

  • Windows11上面打不开

  • Windows Server 2012上无法弹出手动选择保存路径选项。

  • Windows 10 :自行测试

官方动图使用教程

  • 动图教程

下载所需文件

  1. 前往GitHub下载最新版本的脚本文件IndexOfDownloader.ps1

    文件下载地址
    
    https://github.com/lazaroblanc/Index-of-downloader/releases

  2. 下载wget程序(选择你系统对应的版本)

    文件下载地址
    
    https://eternallybored.org/misc/wget/

  3. 将下载的两个文件放在同一个文件夹内,文件夹路径不要有中文。

批量下载文件

  1. 点击IndexOfDownloader.ps1脚本文件,右键选择使用PowerShell运行。

  2. 输入Y确定

  3. 在框内粘贴你想下载的文件服务器某文件夹内文件的文件夹路径,然后点击确定。
    (注意:下载地址最后面要加/符号,表示下载当前路径下的所有文件。)

    #演示使用作者演示使用的地址
    
    https://dserver.bundestag.de/btd/17/CD14600/Dokumente/

    image-gdjs.png

  4. 脚本会自动执行命令,测试时脚本无法调用文件资源管理器,所以无法选择路径,默认下载的文件都会存储在脚本所在的文件夹内。
    文件下载完毕之后直接关闭Windows PoweShell窗口就行。

  5. 文件全部下载完毕。

脚本解析

  • 脚本命令(有看得懂的可以自行修改)

    [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
    

项目地址

功德+1(狗子).gif

👇👇👇