如何使用Invoke-WebRequest下载文件,但自动使文件名与我通过浏览器下载的文件名相同?我还没有找到一种方法让-OutFile
无法手动指定文件名。我很好,还涉及其他几行代码。
一个好的解决方案是:
http://go.microsoft.com/fwlink/?LinkId=393217
,但它会下载文件rtools_setup_x64.exe
。谢谢!
答案 0 :(得分:7)
对于给出的示例,您需要获取重定向的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
,您应该可以从那里下载文件。
答案 1 :(得分:0)
感谢Ryan,我有一个半可用的功能:
Function Get-Url {
param ( [parameter(position=0)]$uri )
invoke-webrequest -uri "$uri" -outfile $(split-path -path "$uri" -leaf)
}
我已经能够下载的图形文件和xml文件。当我尝试下载此网页并使用Edge打开它时,它有时会工作。
答案 2 :(得分:0)
尝试此方法(由于文件名可能不在响应头中,因此可能并不总是有效)
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()
答案 3 :(得分:0)
我已经注释掉了普通的-Outfile语句,因为这意味着我提前知道了文件名。 我已经根据多种来源将它们放在一起,有很多解析Content-Disposition标头的方法,因此请使用适合您的任何方法。
$outpath = "C:\\temp\\"
$result = Invoke-WebRequest -method GET -Uri $resourceUrl -Headers
$resourceHeaders -Verbose #-OutFile $($outPath+"$nodeId.pdf")
$outFilename = $outpath+$result.Headers.'Content-Disposition'.Split("=")[1].Split('\\""')[1] #shaky parsing - might require improvement in time
[System.IO.File]::WriteAllBytes($outFilename, $result.content)
答案 4 :(得分:-2)
powershell.exe Invoke-WebRequest -Uri serverIP / file.exe -OutFile C:\ Users \ file.exe