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

Vim*_*mes 14 powershell

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

一个好的解决方案将:

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

谢谢!

The*_*ian 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")
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,这是从响应URL的末尾解析文件名的问题(来自System.IO.Path的GetFileName将执行此操作):

$FileName = [System.IO.Path]::GetFileName((Get-RedirectedUrl "http://go.microsoft.com/fwlink/?LinkId=393217"))
Run Code Online (Sandbox Code Playgroud)

这将离开$FileName = rtools_setup_x64.exe,你应该能够从那里下载你的文件.

  • 我认为你也可以使用Split-Path作为GetFilename的替代品.`Invoke-Webrequest -Uri $ uri -OutFile $(Split-Path -Path $ uri -Leaf)` (5认同)
  • 我不关心这个解决方案,因为它假定URL中存在文件名,但并非总是如此.虽然URL可用于推断文件名,但是将文件的响应内容解析的更可靠方法是服务器提供指示文件名的Content-Disposition标头. (2认同)

Don*_*tor 6

试试这个方法(可能并不总是有效,因为文件名可能不在响应头中)

  1. 调用 Invoke-WebRequest 获取结果。然后您可以检查结果以查看标题中的内容。
  2. 从响应头中获取文件名(这可能在 Headers.Location 或其他地方。当我运行查询我正在排除故障的 url 时,我在 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()
Run Code Online (Sandbox Code Playgroud)


Tod*_*dge 5

感谢 Ryan 我有一个半可用的功能:

Function Get-Url {
  param ( [parameter(position=0)]$uri )
  invoke-webrequest -uri "$uri" -outfile $(split-path -path "$uri" -leaf)
}
Run Code Online (Sandbox Code Playgroud)

我已经能够下载图形文件和xml文件。当我尝试下载此网页并使用 Edge 打开它时,它有时会起作用。