PowerShell Invoke-WebRequest,如何自动使用原始文件名?

时间:2014-08-04 19:10:12

标签: powershell

如何使用Invoke-WebRequest下载文件,但自动使文件名与我通过浏览器下载的文件名相同?我还没有找到一种方法让-OutFile无法手动指定文件名。我很好,还涉及其他几行代码。

一个好的解决方案是:

  • 即使文件名不在请求网址中,也能正常工作。例如,下载Visual Studio x64远程调试工具的URL为http://go.microsoft.com/fwlink/?LinkId=393217,但它会下载文件rtools_setup_x64.exe
  • 在写入磁盘之前不要将整个文件保存到内存中,除非使用-OutFile参数调用Invoke-WebRequest已经执行的操作(?)

谢谢!

5 个答案:

答案 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)

尝试此方法(由于文件名可能不在响应头中,因此可能并不总是有效)

  1. 调用Invoke-WebRequest以获取结果。然后您可以检查结果以查看标题中的内容。
  2. 从响应标头中获取文件名(可以在Headers.Location或其他位置。当我查询要进行故障排除的网址时,我在Headers [“ Content-Disposition”中找到了它],看起来像inline; filename="zzzz.docx"
  3. 根据名称创建一个新文件,并将内容写入该文件

这是代码示例:

$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)

我的代码的本质-使用PS 5.1可以正常工作。

我已经注释掉了普通的-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

编写文件(对我来说主要是pdf

[System.IO.File]::WriteAllBytes($outFilename, $result.content)

答案 4 :(得分:-2)

powershell.exe Invoke-WebRequest -Uri serverIP / file.exe -OutFile C:\ Users \ file.exe