如何修改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
相关产品推荐
相关产品推荐

