Windows PowerShell에서 wget을 대체하는 기본 대안은 무엇입니까?


283

나는 언급 된 라이브러리 (Windows 용 wget)를 다운로드하여 설치할 수 있지만 내 질문은 다음과 같습니다.

Windows PowerShell에는 wget?에 대한 기본 대안이 있습니까?

내가 필요로 wgetHTTP GET으로 지정된 URL에서 파일을 검색 할 수 단순히. 예를 들어 :

wget http://www.google.com/

답변:


236

다음은 간단한 PS 3.0 이상이 작동하고 많은 PS barf를 포함하지 않는 하나의 라이너입니다.

wget http://blog.stackexchange.com/ -OutFile out.html

참고 :

  • wget 에 대한 별칭입니다 Invoke-WebRequest
  • Invoke-WebRequest는 HtmlWebResponseObject를 반환하는데 , 여기에는 Links, Images, Forms, InputFields 등과 같은 유용한 HTML 파싱 속성이 많이 포함되어 있습니다.
  • 파일 내용은 디스크에 쓰기 전에 메모리에 저장되므로이 방법은 큰 파일을 다운로드하는 데 적합하지 않습니다
  • Windows Server Core 설치에서는 다음과 같이 작성해야합니다.

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • 2014 년 9 월 20 일 이전에 제안했습니다.

    (wget http://blog.stackexchange.com/).Content >out.html
    

    답으로. 그러나 >연산자 (가명 Out-File)는 입력을 유니 코드로 변환하기 때문에 모든 경우에 작동하지는 않습니다 .

Windows 7을 사용하는 경우 버전 4 이상의 Windows Management Framework를 설치해야합니다.

$ProgressPreference = "silentlyContinue"이전 작업을 수행하면 Invoke-WebRequest큰 파일의 다운로드 속도가 크게 향상 될 수 있습니다. 이 변수는 진행률 UI 렌더링 여부를 제어합니다.


3
이것은 이제 정답이며 실제 wget이 설치되어 있으면 실수로 wget을 테스트했습니다. 파일 이름을 쉽게 얻을 수 없다는 성가신 (출력 리디렉션에 지정해야 함),이 옵션은 실제 wget보다 UI가 더 좋으므로 (제 의견으로는) 있습니다.
Matthew Scharley

13
그러나 Windows 7에는 PowerShell 2.0 만 제공되며 결과는 " 'Invoke-WebRequest'라는 용어는 cmdlet의 이름으로 인식되지 않습니다 ..."입니다.
피터 Mortensen

16
공정한 경고 :이 방법은 파일에 파일을 쓰기 전에 파일의 전체 내용을 메모리에 저장합니다. 큰 파일을 다운로드하기에는 좋은 해결책이 아닙니다.
im_nullable

2
@im_nullable, good call-게시물에 추가했습니다.
Warren Rumak

1
@ dezza 다른 접근법으로 답변을 업데이트했습니다. 다시 시도하십시오.
워렌 루막

181

파일 만 검색 하면 WebClient 객체 의 DownloadFile 메서드를 사용할 수 있습니다 .

$client = New-Object System.Net.WebClient
$client.DownloadFile($url, $path)

어디 $url파일의 URL을 나타내는 문자열이며, $path파일에 저장됩니다 로컬 경로를 대표한다.

그 참고 $path파일 이름을 포함해야합니다; 단지 디렉토리가 될 수 없습니다.


32
지금까지 이것이 제안 된 최상의 솔루션이었습니다. 또한 지금까지 내가 본 (new-object System.Net.WebClient).DownloadFile( '$url, $path)최고의 통신이므로 한 줄 형식으로 다시 작성할 수있는 것으로 보입니다 wget. 감사!
jsalonen

3
참고로 (new-object System.Net.WebClient) .DownloadFileAsync (url, filePath)
James

웹 클라이언트를 통해 특정 텍스트를 가져와 메모장으로 가져올 수 있습니까? 감사합니다
Mowgli

6
예, Windows 7 ( PowerShell 2.0과 함께 제공) 에서 즉시 작동합니다 . 샘플 : $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html")
Peter Mortensen 2016

3
URL을 가져 와서 결과를 무시하려면 (예 : IIS 예열 스크립트의 일부) DownloadData를 사용하십시오.(new-object System.Net.WebClient).DownloadData($url) | Out-Null
BurnsBA

86

Invoke-WebRequest다가오는 PowerShell을 버전 3 :

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html

9
모든 우아함 dd...
gWaldo

1
@gWaldo 당신은 농담입니다 – 이것은 PS를 배우는 누군가로서 말하는 것이 기쁨입니다
Jack Douglas

8
단지 파일에 ( 덮어 쓰기) 또는 (추가하기 위해 ) -Outfile사용할 수있을 때 매개 변수가 불필요한 것처럼 보입니다 . >>>
gWaldo

5
@gWaldo 또는 심지어 URL에서 파일 이름을 추론하는 것처럼 wget:)
Peltier

5
그리고 PS 4.0로, wget그리고 curl에 aliasted 있습니다 Invoke-WebRequest( iwr기본적으로) : D

18

약간 지저분하지만 파일 다운로드 지침을 제공하는 이 블로그 게시물 이 있습니다.

또는 BITS를 사용할 수 있습니다 (권장하는 것이 좋습니다).

Import-Module BitsTransfer
Start-BitsTransfer -source "http://urlToDownload"

진행률이 표시되고 파일을 현재 디렉토리로 다운로드합니다.


3
BITS는 서버 쪽의 지원에 의존하며, 가능한 경우 백그라운드에서 작동하며 다른 cmdlet을 사용하여 진행률을 업데이트 할 수 있습니다.
Richard

2
google.com 을 가져 오려고 했지만 얻을 수있는 것은 Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))입니다. 나는 의아해한다 : |
jsalonen

1
@jsalonen BITS는 페이지가 아닌 파일 만 다운로드한다고 생각합니다. Richard가 말했듯이 일부 서버 측 지원에 의존하지만 (Microsoft와 관련이 없다고 생각하지만).
Matthew Steeples

나는 BITS를 사용하는 것이 중요하다고 생각하지만 여기에서 내가 찾고있는 것은 아닙니다.
jsalonen

6

PowerShell V4 원 라이너 :

(iwr http://blog.stackexchange.com/).Content >index.html`

또는

(iwr http://demo.mediacore.tv/files/31266.mp4).Content >video.mp4

이것은 기본적으로 Warren의 (굉장한) V3 one-liner입니다 (감사합니다!) -V4 PowerShell에서 작동하도록 약간 변경했습니다.

단순히 사용 wget하기보다는 단순히 사용하는 Warren의 단일 라이너iwr 는 여전히 V3에서 작동해야합니다 (적어도, 테스트하지는 않았습니다). 어쨌든. 그러나 V4 PowerShell 에서 실행하려고하면 (실제로 시도한 것처럼) PowerShell wget이 유효한 cmdlet / 프로그램으로 확인되지 않습니다.

내가 고른부터로 - 관심있는 경우, 즉 밥의 코멘트 에 대한 응답으로 허용 대답 (고마워!) - 때문에 PowerShell을 V4의 같은 wgetcurl에 별명되는 Invoke-WebRequest설정, iwr기본적으로 . 따라서 wget해결할 수 없으며 여기 에서도 curl작동하지 않습니다 .


4

파일을 다운로드하기 전에 짧은 URL을 확인하는 PowerShell 기능은 다음과 같습니다.

function Get-FileFromUri {  
    param(  
        [parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
        [string]
        [Alias('Uri')]
        $Url,
        [parameter(Mandatory=$false, Position=1)]
        [string]
        [Alias('Folder')]
        $FolderPath
    )
    process {
        try {
            # resolve short URLs
            $req = [System.Net.HttpWebRequest]::Create($Url)
            $req.Method = "HEAD"
            $response = $req.GetResponse()
            $fUri = $response.ResponseUri
            $filename = [System.IO.Path]::GetFileName($fUri.LocalPath);
            $response.Close()
            # download file
            $destination = (Get-Item -Path ".\" -Verbose).FullName
            if ($FolderPath) { $destination = $FolderPath }
            if ($destination.EndsWith('\')) {
                $destination += $filename
            } else {
                $destination += '\' + $filename
            }
            $webclient = New-Object System.Net.webclient
            $webclient.downloadfile($fUri.AbsoluteUri, $destination)
            write-host -ForegroundColor DarkGreen "downloaded '$($fUri.AbsoluteUri)' to '$($destination)'"
        } catch {
            write-host -ForegroundColor DarkRed $_.Exception.Message
        }  
    }  
}  

다음과 같이 파일을 현재 폴더로 다운로드하십시오 :

Get-FileFromUri http://example.com/url/of/example/file  

또는 지정된 폴더로 파일을 다운로드하려면

Get-FileFromUri http://example.com/url/of/example/file  C:\example-folder  

2

다음 함수는 URL을 얻습니다.

function Get-URLContent ($url, $path) {
  if (!$path) {
      $path = Join-Path $pwd.Path ([URI]$url).Segments[-1]
  }
  $wc = New-Object Net.WebClient
  $wc.UseDefaultCredentials = $true
  $wc.Proxy.Credentials = $wc.Credentials
  $wc.DownloadFile($url, $path)
}

일부 의견 :

  1. 마지막 4 줄은 인증 프록시 뒤에있는 경우에만 필요합니다. 간단한 사용을 위해 (New-Object Net.WebClient).DownloadFile($url, $path)잘 작동합니다.
  2. 현재 디렉토리에서 다운로드가 수행되지 않으므로 경로 절대 경로 여야 하므로 상대 경로로 인해 다운로드가 어딘가에서 손실됩니다.
  3. if (!$path) {...}섹션에서는 URL에 지정된 이름을 사용하여 파일을 현재 디렉토리로 다운로드하려는 간단한 경우를 처리합니다.

1

Windows 기능이 설정되면 wget이 포함 된 Windows 10 bash 쉘을 사용하십시오.

Windows에 Ubuntu bash 쉘을 설치하는 방법 :

YouTube : Windows의 Ubuntu에서 Bash를 실행하십시오!

Linux 용 Windows 하위 시스템 설명서


1
링크가 죽었을 때 사용자가 제안한 내용에 따라 해당 링크를 통해서만 사용할 수있는 답변 콘텐츠를 계속 사용할 수 있도록 지원하는이 답변에 인용 된 참조를 추가하십시오.
Pimp Juice IT

0

Windows가 충분히 새 버전 (예 : 버전 1809 이상) 인 경우 "실제"컬을 사용할 수 있습니다. curl에는 명령 줄 옵션 "-O"가 있습니다 (대문자 O; 소문자는 동일하지 않습니다!) "-remote-name"옵션은 "-remote-name"옵션으로 curl에게 저장된 파일을 가져옵니다. URL의 파일 이름 부분과 동일한 이름입니다.

"Invoke-WebRequest"의 별명 "curl"과 구별하기 위해이를 "curl.exe"로 시작해야합니다. 우연히 그것은 변경없이 cmd.exe에서 작동합니다.

다른 답변과 동일한 예를 사용하십시오.

curl.exe -O http://demo.mediacore.tv/files/31266.mp4

(사이트는 이것을 위해 코멘트로 추가 할 수 없습니다. 분명히 그것에 대한 "평판"이 더 필요하기 때문에 새로운 답변을 얻습니다)


0

-outfile 매개 변수가있는 Invoke-WebRequest는 문자열을 예상하므로 파일 이름이 따옴표로 묶지 않고 숫자로 시작하면 출력 파일이 작성되지 않습니다.

예. Invoke-WebRequest -Uri "http://www.google.com/" -outfile "2.pdf"

문자로 시작하는 파일 이름에는 영향을 미치지 않습니다.


이 솔루션은 다른 답변에서 언급되었습니다 ( wget의 별칭이며 Invoke-WebRequest위와 유사 함)
bertieb

대답의 요점은 그 메모를 강조하는 것이 었습니다. 구문 오류로 인해 생성 된 파일이없는 응답은 없습니다.
짐바

그것은 실제로 다른 답변에 대한 의견이어야합니다.
bertieb

이 답변은 다른 답변이나 위의 답변과 유사하지 않습니다.
짐바

-1

이것은 브라우저가 초기화하지 않은 것들을 피하기 위해 작동해야합니다. "-UseBasicParsing"매개 변수에 유의하십시오.

Invoke-WebRequest http://localhost -UseBasicParsing

(1)“브라우저 초기화 항목 없음”이란 무엇입니까? (2) 수락 된 답변에는 이미 언급되어 -UseBasicParsing있습니다.
스콧
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.