web-dev-qa-db-ja.com

Windows PowerShellでのwgetのネイティブ代替ですか?

私は、上記のライブラリ(Windows用のwget)をダウンロードしてインストールできることを知っていますが、私の質問はこれです:

Windows PowerShellでは、wgetに代わるネイティブの方法はありますか?

HTTP GETで与えられたURLからファイルを取得するためだけにwgetが必要です。例えば:

wget http://www.google.com/
277
jsalonen

これは簡単でPS 3.0以降のワンライナーです。

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

ご了承ください:

  • wgetInvoke-WebRequestのエイリアスです
  • Invoke-WebRequestは HtmlWebResponseObject を返します。これには、リンク、画像、フォーム、InputFieldなどの便利な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がレンダリングされるかどうかを制御します。

230
Warren Rumak

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

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

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

$pathにはファイル名を含める必要があります。単なるディレクトリにはできません。

180

今後のPowerShellバージョン3には Invoke-WebRequest があります。

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

ちょっと面倒ですが、 このブログ記事 にファイルをダウンロードするための指示があります。

あるいは(そしてこれは私がお勧めします)あなたはBITSを使うことができます:

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

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

17

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では。

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

興味のある人のために、それは - 私が 受け入れられた答えに返信して Bobのコメント から選んだように - man!) - PowerShell V4ではwgetcurlInvoke-WebRequestにエイリアスされ、デフォルトでiwrに設定されています。したがって、wgetは解決できませんcurlはここでは機能しません)

6
eyecatchUp

これは、ファイルをダウンロードする前に短い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  
4
user25986

次の関数は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で指定された名前を使用してファイルを現在のディレクトリにダウンロードするという単純なケースを扱います。
2
Paul Moore

Windowsの機能がセットアップされたら、wgetを含むWindows 10 bashシェルを使用してください。

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

YouTube:Windows上のUbuntuでBashを実行する!

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

1
Miloud Eloumri

-outfileパラメータを指定したInvoke-WebRequestは文字列を必要とするため、ファイル名が引用符で囲まれていない数字で始まる場合、出力ファイルは作成されません。

例えば。 Invoke-WebRequest -Uri "http://www.google.com/" -outfile "2.pdf"

これは文字で始まるファイル名には影響しません。

0
Zimba

あなたのウィンドウズが十分に新しいなら(バージョン1809かそれ以降のように)、利用可能な「本当の」カールがあります。 curlには、コマンドラインオプション "-O"(大文字のO;小文字は同じではありません!)があります。 URLのファイル名部分と同じ名前。

"Invoke-WebRequest"のエイリアス "curl"と区別するために、これを "curl.exe"として開始する必要があります。ちなみにそれは変更なしにcmd.exeで動作します。

ここで別の答えと同じ例を使用して

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

(このサイトではこれをコメントとして追加することは許可されていません。どうやらそのためにはもっと「評判」が必要なので、新しい答えを得ます)

0
Dweia