Windows PowerShellのwgetに代わるネイティブ?


284

前述のライブラリ(Windows用のwget)をダウンロードしてインストールできることは知っていますが、私の質問は次のとおりです。

Windows PowerShellには、ネイティブの代替手段がありwgetますか?

wgetHTTP GETを使用して、指定されたURLからファイルを取得するだけです。例えば:

wget http://www.google.com/

回答:


237

簡単でPS barfを使用しないPS 3.0以降のシンプルなワンライナーを次に示します。

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

ご了承ください:

  • wget はのエイリアスです Invoke-WebRequest
  • 起動-WebRequestクラスを返しHtmlWebResponseObjectなどのリンク、画像、フォーム、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)が入力をUnicodeに変換するため、これはすべての場合に機能するわけではありません。

Windows 7を使用している場合は、バージョン4以降のWindows Management Frameworkをインストールする必要があります。

$ProgressPreference = "silentlyContinue"以前の操作を行うと、Invoke-WebRequest大きなファイルのダウンロード速度が大幅に向上する場合があります。この変数は、進行状況UIがレンダリングされるかどうかを制御します。


3
これが正しい答えです。実際にwgetがインストールされているかどうかを誤ってテストしました。ファイル名を簡単に取得できないことに悩まされます(出力リダイレクトで指定する必要があります)が、このオプションは(私の意見では)実際のwgetよりも優れたUIを持っているため、それがあります。
マシューシャーリー

13
ただし、Windows 7にはPowerShell 2.0のみが付属し、結果は「「Invoke-WebRequest」という用語はコマンドレットの名前として認識されません...」になります。
ピーターモーテンセン14

16
公正な警告:このメソッドは、ファイルに書き込む前にファイルの内容全体をメモリに入れます。これは、大きなファイルをダウンロードするのに適したソリューションではありません。
im_nullable 14

2
@im_nullable、良い電話-それを投稿に追加しました。
ウォーレンRumak 14

1
@dezza別のアプローチで答えを更新しました。もう一回やってみよう。
ウォーレンRumak 14

181

ファイルを取得するだけの場合は、WebClientオブジェクトのDownloadFileメソッドを使用できます。

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

where $urlは、ファイルのURLを表す文字列であり$path、ファイルが保存されるローカルパスを表します。

$pathファイル名を含める必要があることに注意してください。単なるディレクトリにすることはできません。


32
これまでのところ、これが提案された最良のソリューションです。また、これまで見(new-object System.Net.WebClient).DownloadFile( '$url, $path)た中で最高の対応であるため、1行の形式で書き直すことができるようwgetです。ありがとう!
jsalonen

3
補足として、(new-object System.Net.WebClient).DownloadFileAsync(url、filePath)のようなものを使用して非同期的にこれを行うこともできます
ジェームズ

Webclient経由で特定のテキストをフェッチし、メモ帳に出力できますか?ありがとう
-Mowgli

6
はい、これはWindows 7(PowerShell 2.0に付属)でそのまま使用できます。サンプル: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html")
ピーターモーテンセン14

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...のすべての優雅さ
グワルド

1
@gWaldoあなたは冗談です-これは使用する喜びです(PSを学んでいる誰かとして話す)
ジャックダグラス

8
ファイルに(上書きする)または(追加する)-Outfileだけを使用できる場合、パラメーターは無関係であるように見えます。>>>
-gWaldo

5
@gWaldoまたはURLからファイル名を推測することもできますwget:)
ペルチェ

5
そして、PS 4.0のように、wgetcurlにaliastedされているInvoke-WebRequestiwrデフォルト):D
ボブ・

18

少し面倒ですが、ファイルをダウンロードするための指示を提供するこのブログ投稿があります。

または、BITSを使用できます(これがお勧めです)。

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

進行状況が表示され、ファイルが現在のディレクトリにダウンロードされます。


3
BITSは、サーバーエンドでのサポートに依存しています。これが利用可能な場合、これはバックグラウンドで機能し、他のコマンドレットで進行状況の更新を取得できます。
リチャード

2
google.comを取得しようとしましたが、取得できるのはのみStart-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))です。私は困惑しています:|
jsalonen

1
@jsalonen BITSはページではなくファイルのみをダウンロードすると思います。リチャードが言うように、サーバー側のサポートに依存しています(ただし、Microsoft固有のものではないと思います)。
マシュースティープルズ

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ワンライナーです (これに感謝します!) -V4 PowerShellで動作するようにわずかな変更を加えています。

ウォーレンのワンライナー -単に使用するのwgetではなくiwr-は、V3でも動作するはずです(少なくとも、私は推測しますが、テストしませんでした)。とにかく。ただし、V4 PowerShell で実行しようとすると(私が試したように)、PowerShell wgetが有効なコマンドレット/プログラムとして解決できないことがわかります。

私はから拾って-興味のある方のために、つまり、ボブさんのコメントに返信して受け入れ答え (おかげで、男!) -ための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シェルを使用します。

Ubuntu bashシェルをWindowsにインストールする方法:

YouTube:Windows上のUbuntuでBashを実行しています!

Linuxドキュメント用Windowsサブシステム


1
この回答に引用符で囲まれた参照を追加することを検討してください。リンクが機能しなくなった場合に、あなたの提案に応じて、現在そのリンクを介してのみ利用可能な回答コンテンツが利用できます。
ピンプジュースIT

0

Windowsが十分に新しい場合(バージョン1809以降など)、「実際の」カールが利用可能です。curlにはコマンドラインオプション「-O」があります(大文字のO、小文字でも同じことはできません!)オプション「-O」、または「--remote-name」は、保存されたファイルが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、上記と同様、1)
bertieb

答えのポイントは、メモを強調することでした。構文エラーが原因でファイルが作成されていないことに対処する回答はありません。
ジンバ

それは本当に他の答え[s]へのコメントでなければなりません
-bertieb

この回答は、他の回答では提供されておらず、上記の回答にも類似していません。
ジンバ

-1

これは、ブラウザで初期化されていないものを回避するために機能するはずです。「-UseBasicParsing」パラメーターに注意してください。

Invoke-WebRequest http://localhost -UseBasicParsing

(1)「ブラウザで初期化されないもの」とは何ですか?(2)受け入れられた答えがすでに言及していることに注意してください-UseBasicParsing
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.