You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PowerShell脚本解决Web目录全量下载失败问题?

问题解决与脚本修改方案

问题分析

从报错信息可知,目标Web目录(https://subDom.mainDom.com:4434/subFolder/)要求身份验证,返回401未授权错误,而原脚本未处理认证逻辑;同时原脚本仅支持一级目录下载,无法适配多级子文件夹的需求。

核心解决思路

  • 新增身份验证逻辑(根据目标站点类型选择基本认证或Windows集成认证)
  • 实现递归遍历多级子目录,自动创建本地对应文件夹并下载文件

脚本修改方案

方案1:适配基本认证(Basic Authentication)

如果目标站点使用用户名/密码的基本认证,使用以下脚本:

add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
    public bool CheckValidationResult(
        ServicePoint srvPoint, X509Certificate certificate,
        WebRequest request, int certificateProblem) {
        return true;
    }
}
"@

# 配置安全协议与证书信任
[System.Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Tls11
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

# 配置参数
$outputdir = 'C:\temp'
$url       = 'https://subDom.mainDom.com:4434/subFolder/'
$username  = '你的用户名'
$password  = ConvertTo-SecureString '你的密码' -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($username, $password)

# 递归下载函数
function Invoke-RecursiveDownload {
    param(
        [string]$currentUrl,
        [string]$currentLocalDir
    )

    # 创建本地目录
    if (-not (Test-Path -Path $currentLocalDir)) {
        New-Item -ItemType Directory -Path $currentLocalDir | Out-Null
    }

    # 获取当前目录内容
    try {
        $webResponse = Invoke-WebRequest -Uri $currentUrl -Credential $credential
        # 遍历所有链接,跳过上级目录(../)
        $webResponse.Links | Select-Object -ExpandProperty href | Where-Object { $_ -ne '../' } | ForEach-Object {
            $itemHref = $_
            $itemUrl = '{0}/{1}' -f $currentUrl.TrimEnd('/'), $itemHref
            $itemLocalPath = Join-Path -Path $currentLocalDir -ChildPath $itemHref

            # 判断是文件夹还是文件:以/结尾的是文件夹
            if ($itemHref.EndsWith('/')) {
                # 递归处理子文件夹
                Invoke-RecursiveDownload -currentUrl $itemUrl -currentLocalDir $itemLocalPath
            } else {
                # 下载文件
                Write-Host "正在下载: $itemUrl"
                Invoke-WebRequest -Uri $itemUrl -OutFile $itemLocalPath -Credential $credential
            }
        }
    } catch {
        Write-Error "处理 $currentUrl 时出错: $_"
    }
}

# 启动递归下载
Invoke-RecursiveDownload -currentUrl $url -currentLocalDir $outputdir

方案2:适配Windows集成认证(NTLM/Kerberos)

如果目标站点使用Windows域账号认证,替换认证部分逻辑即可:

# 替换原认证相关代码,使用当前登录账号或指定域账号
# 使用当前登录账号:
$credential = [System.Net.CredentialCache]::DefaultCredentials

# 或者指定域账号:
# $username = '域名\用户名'
# $password = ConvertTo-SecureString '你的密码' -AsPlainText -Force
# $credential = New-Object System.Management.Automation.PSCredential ($username, $password)

其余代码与方案1一致。

额外注意事项

  • 确保目标站点允许递归访问,部分Web服务器可能限制目录遍历
  • 大量文件下载时,可添加重试逻辑(比如try/catch中加入Start-Sleep和重试次数)
  • 若目标站点证书是自签名的,保留原脚本中的TrustAllCertsPolicy代码;若使用合法证书,可删除该部分以提升安全性

内容的提问来源于stack exchange,提问作者Rontdu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:34:54