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

9rnv2umw  于 2023-04-21  发布在  Shell
关注(0)|答案(5)|浏览(140)

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

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

谢谢!

tsm1rwdh

tsm1rwdh1#

对于给定的示例,您将需要获取重定向的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,您应该能够从那里下载文件。

57hvy0tb

57hvy0tb2#

尝试此方法(可能并不总是有效,因为文件名可能不在响应头中)
1.调用Invoke-WebRequest来获取结果。然后你可以检查结果来查看头中的内容。
1.从响应头中获取文件名(这可能在Headers.Location或其他地方。当我运行对正在进行故障排除的URL的查询时,我在Headers[“Content-Disposition”]中找到了它,它看起来像inline; filename="zzzz.docx"
1.根据名称创建一个新文件,并将内容写入此文件
下面是代码示例:

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

bjp0bcyl3#

多亏了Ryan,我有了一个半可用的功能:

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

一个图形文件和XML文件,我已经能够下载。当我试图下载这个网页,并打开它与边缘,它会工作的时候。

vuktfyat

vuktfyat4#

我把这些放在一起是基于一些来源;有很多方法可以解析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()
c9qzyr3d

c9qzyr3d5#

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

相关问题