如何使用 Invoke-WebRequest 下载文件但自动使文件名与通过浏览器下载的文件名相同?如果不手动指定文件名,我还没有找到使
-OutFile
工作的方法。我对这涉及其他几行代码很好。
一个好的解决方案将:
http://go.microsoft.com/fwlink/?LinkId=393217
但它下载文件 rtools_setup_x64.exe
.谢谢!
对于给定的示例,您将需要获取重定向的 URL,其中包括要下载的文件名。您可以使用以下功能来执行此操作:
Function Get-RedirectedUrl {
Param (
[Parameter(Mandatory=$true)]
[String]$URL
)
$request = [System.Net.WebRequest]::Create($url)
$request.AllowAutoRedirect=$false
$response=$request.GetResponse()
If ($response.StatusCode -eq "Found")
{
$response.GetResponseHeader("Location")
}
}
然后是从响应 URL 的末尾解析文件名的问题(System.IO.Path 中的 GetFileName 将执行此操作):
$FileName = [System.IO.Path]::GetFileName((Get-RedirectedUrl "http://go.microsoft.com/fwlink/?LinkId=393217"))
那将离开
$FileName = rtools_setup_x64.exe
,你应该可以从那里下载你的文件。
试试这个方法(可能不总是有效,因为文件名可能不在响应头中)
inline; filename="zzzz.docx"
这里是代码示例:
$result = Invoke-WebRequest -Method GET -Uri $url -Headers $headers
$contentDisposition = $result.Headers.'Content-Disposition'
$fileName = $contentDisposition.Split("=")[1].Replace("`"","")
$path = Join-Path $yourfoldername $fileName
$file = [System.IO.FileStream]::new($path, [System.IO.FileMode]::Create)
$file.write($result.Content, 0, $result.RawContentLength)
$file.close()
感谢 Ryan 我有一个半可用的功能:
Function Get-Url {
param ( [parameter(position=0)]$uri )
invoke-webrequest -uri "$uri" -outfile $(split-path -path "$uri" -leaf)
}
我已经能够下载的图形文件和xml文件。当我尝试下载此网页并使用 Edge 打开它时,它有时会起作用。
我根据许多来源将其放在一起;有很多方法可以解析
Content-Disposition
标头,因此请使用适合您的方法。
$Response = Invoke-WebRequest $Url -Verbose
$FileName = $Response.Headers.'Content-Disposition'.Split('=',2)[-1]
# Older PowerShell versions need to load this manually:
if ($PSVersionTable.PSVersion.Major -le 5) {
Add-Type -AssemblyName System.Net.Http
}
$FileName = [Net.Http.Headers.ContentDispositionHeaderValue]::Parse(
$Response.Headers.'Content-Disposition').FileName
[IO.File]::WriteAllBytes($FileName, $Response.Content)
Remove-Variable Response -Force
[GC]::Collect()
powershell.exe Invoke-WebRequest -Uri serverIP/file.exe -OutFile C:\Users ile.exe