programing

PowerShell Invoke-WebRequest, 원본 파일 이름을 자동으로 사용하는 방법은?

padding 2023. 10. 30. 20:47
반응형

PowerShell Invoke-WebRequest, 원본 파일 이름을 자동으로 사용하는 방법은?

Invoke-WebRequest를 사용하여 파일을 다운로드하지만 자동으로 브라우저를 통해 다운로드한 파일 이름과 동일하게 만드는 방법은 무엇입니까?나는 만들 방법을 찾지 못했습니다.-OutFile파일 이름을 수동으로 지정하지 않고 작업합니다.다른 코드 몇 줄을 포함해서 해도 괜찮습니다.

좋은 해결책은 다음과 같습니다.

  • 요청 URL에 파일 이름이 없더라도 작동합니다. 예를 들어 Visual Studio x64 Remote Debugging Tools를 다운로드할 URL은http://go.microsoft.com/fwlink/?LinkId=393217하지만 그것은 파일을 다운로드 합니다.rtools_setup_x64.exe.
  • 디스크에 쓰기 전에 전체 파일을 저장하지 마십시오. Invoke-WebRequest가 -OutFile 매개 변수(?)를 사용해도 이미 이 작업을 수행하지 않는 한.

감사합니다!

예를 들어 다운로드할 파일 이름을 포함하는 리디렉션 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(시스템에서 GetFileName) 끝에서 파일 이름을 구문 분석하는 문제입니다.IO.Path가 그렇게 함):

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

떠나가겠습니다.$FileName = rtools_setup_x64.exe거기서 파일을 다운로드 할 수 있을 겁니다.

라이언 덕분에 반쯤 쓸 수 있는 기능을 갖게 되었습니다.

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

내가 다운로드 할 수 있었던 그래픽 파일과 xml 파일.이 웹 페이지를 다운로드하고 Edge를 사용하여 열려면 때때로 작동합니다.

이 방법을 사용해 보십시오. 파일 이름이 응답 헤더에 없을 수 있으므로 항상 작동하지 않을 수 있습니다.

  1. Invoke-WebRequest를 호출하여 결과를 가져옵니다.그런 다음 결과를 검사하여 머리글에 무엇이 있는지 확인할 수 있습니다.
  2. 응답 헤더에서 파일 이름을 가져옵니다(이 파일 이름은 헤더에 있을 수 있습니다).장소나 다른 장소.문제 해결 중인 url에 대한 쿼리를 실행하면 헤더["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()

여러 출처를 바탕으로 이 내용을 정리했습니다. 여러 가지 방법으로 분석할 수 있습니다.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 서버IP/file.exe -OutFile C:\Users\file.exe

언급URL : https://stackoverflow.com/questions/25125818/powershell-invoke-webrequest-how-to-automatically-use-original-file-name

반응형