URLからのWindowsバッチファイルファイルのダウンロード


112

Windowsバッチファイルを使用してWebサイト(例:http://www.example.com/package.zip)からファイルをダウンロードしようとしています。以下の関数を記述すると、エラーコードが表示されます。

xcopy /E /Y "http://www.example.com/package.zip"

バッチファイルは、httpの後の「/」が好きではないようです。これらの文字をエスケープする方法はありますか?そのため、それらが関数パラメーターであるとは想定されていませんか?


ここで:stackoverflow.com/questions/28143160/…サードパーティのソフトウェアなしでネイティブツールのみを使用してWindowsでファイルをダウンロードする方法を再開しようとしました。
npocmaka 2015年

回答:


135

PowerShell 2.0(Windows 7がプリインストールされている)では、以下を使用できます。

(New-Object Net.WebClient).DownloadFile('http://www.example.com/package.zip', 'package.zip')

PowerShell 3.0以降(Windows 8がプリインストールされています)を使用できますInvoke-WebRequest

Invoke-WebRequest http://www.example.com/package.zip -OutFile package.zip

バッチファイルからそれらは呼ばれます:

powershell -Command "(New-Object Net.WebClient).DownloadFile('http://www.example.com/package.zip', 'package.zip')"
powershell -Command "Invoke-WebRequest http://www.example.com/package.zip -OutFile package.zip"

(PowerShell 2.0は、XP、3.0 for Windows 7にインストールできます)


2
涼しい!非推奨ではないため、bitsadmin.exeよりも優れています。
sinelaw、2014年

@ sevenforce、Powershell 2.0コマンドはPowershell 3.0でも機能しますか、それともそのPowershell 3.0構文を使用する必要がありますか?
リッチシグネル2015年

4
@RichSignell:2.0コマンドは3.0でも機能します。ちなみに私が気付いた2.0コマンドでは、絶対でないターゲットパスの場合、ファイルはユーザーのホームフォルダーに対して相対的に保存されます。
sevenforce 2015年

1
これは素晴らしいです。私はこれを長い間探していました。ありがとうございました!それでも2017年に動作します
アルバートMN。

2
2.0コードは、最新のWin 7で動作します。また、PowerShellの管理者権限を与えなくても機能するため、unknown .bat.ps1ファイルをクリックすると、本当に物事が台無しになる可能性があるという概念の完全な証明としてこれを立ててください。
1934286

97

あなたがしようとしていることを達成できる標準のWindowsコンポーネントがあります:BITS。XPおよび2000 SP3以降、Windowsに含まれています。

実行:

bitsadmin.exe /transfer "JobName" http://download.url/here.exe C:\destination\here.exe

ジョブ名は、単にダウンロードジョブの表示名です-実行していることを説明するものに設定してください。


14
素敵なツール!しかし私のwin8は次のように述べています。
Peteter 2013

1
すでに述べたように、bitsadminはタスクスケジューラから実行される自動バッチでは機能しません:(
TomeeNS

1
@cmroanirgo bitsadminは、Windows XP Home Editionでは使用できません。
カスケードスタイル、

1
Windows 10 Pro
でも引き続き

3
ありがとうございました!感染したコンピュータの魅力のように動作し、他にWebからファイルをダウンロードする方法はありませんでした。(Powershellでも起動できませんでした)
szab.kel

29

これは少し外れたトピックかもしれませんが、Powershellを使用してファイルを簡単にダウンロードできます。Powershellには最新バージョンのWindowsが付属しているため、コンピューターに追加のものをインストールする必要はありません。私はこのページを読んでそれを行う方法を学びました:

http://teusje.wordpress.com/2011/02/19/download-file-with-powershell/

コードは:

$webclient = New-Object System.Net.WebClient
$url = "http://www.example.com/file.txt"
$file = "$pwd\file.txt"
$webclient.DownloadFile($url,$file)

2
そのブログを検索すると、PowerShellの新しいバージョン3.0
juFo

私はあなたが必要とは思わないSystemSystem.Net.WebClient
1934286

25

最後に確認したところ、MSコマンドラインからURLに接続するためのコマンドラインコマンドはありません。Windowsでwgetを試す:http :
//gnuwin32.sourceforge.net/packages/wget.htm

またはURL2File:http ://www.chami.com/free/url2file_wincon.html

Linuxでは、「wget」を使用できます。

または、VBScriptを試すこともできます。これらはコマンドラインプログラムに似ていますが、wscript.exeスクリプトホストによって解釈されるスクリプトです。VBSを使用してファイルをダウンロードする例を次に示します。https
//serverfault.com/questions/29707/download-file-from-vbscript


2
wgetやサードパーティの統合は必要ありません。BITS(XP以降の標準Windowsコンポーネント)は、MSコマンドラインからbitsadminユーティリティを使用してそれを行うことができます。回答が投稿されました-少し遅れていますが(2年遅れていますか?)
brainwood 2013

17

PURE BATCHでファイルをダウンロードしています...

JScript、VBScript、Powershellなどなし...純粋なバッチのみ!

一部の人々は、JScriptやVBScriptなどを使用せずにバッチスクリプトでファイルをダウンロードすることは不可能だと言っています...しかし、それらは間違いなく間違っています!

これは、バッチスクリプトでファイルをダウンロードするのに非常にうまく機能するように見える単純な方法です。ほとんどすべてのファイルのURLで機能するはずです。必要に応じて、プロキシサーバーを使用することもできます。

ファイルのダウンロードには、WindowsシステムのBITSADMIN.EXEを使用できます。何かをダウンロード/インストールしたり、JScriptやVBScriptなどを使用したりする必要はありません。Bitsadmin.exeは、Windows XPからWindows 10までのほとんどのWindowsバージョンに存在します。

楽しい!


使用法:

次のように、BITSADMINコマンドを直接使用できます。
bitsadmin /transfer mydownloadjob /download /priority FOREGROUND "http://example.com/File.zip" "C:\Downloads\File.zip"

プロキシサーバー:プロキシ
を使用して接続するには、ダウンロードする前にこのコマンドを使用します。
bitsadmin /setproxysettings mydownloadjob OVERRIDE "proxy-server.com:8080" "<local>"

BITSadmin.exeの詳細については、このリンクをクリックしてください


トラブルシューティング:
このエラーが発生した場合:「BITSに接続できません-0x80070422」
Windowsサービスの「バックグラウンドインテリジェント転送サービス(BITS)」が有効になっていることを確認して、再試行してください。(デフォルトで有効になっているはずです。)


カスタム機能
Call :DOWNLOAD_FILE "URL"
Call :DOWNLOAD_PROXY_ON "SERVER:PORT"
Call :DOWNLOAD_PROXY_OFF

私は、bitsadminコマンドを簡略化するためにこれら3つの関数を作成しました。使いやすく覚えやすいです。スクリプトで複数回使用する場合に特に役立ちます。

注意してください...
これらの関数を使用する前に、まずCUSTOM_FUNCTIONS.CMDからスクリプトの最後にそれらをコピーする必要があります。完全な例もあります:DOWNLOAD-EXAMPLE.CMD

:DOWNLOAD_FILE "URL"
主な機能は、URLからファイルをダウンロードします。

:DOWNLOAD_PROXY_ON "SERVER:PORT"
(オプション)プロキシサーバーを使用する必要がある場合は、この関数を使用できます。
:DOWNLOAD_PROXY_OFF関数を呼び出すと、プロキシサーバーが無効になります。

例:
CALL :DOWNLOAD_PROXY_ON "proxy-server.com:8080"
CALL :DOWNLOAD_FILE "http://example.com/File.zip" "C:\Downloads\File.zip"
CALL :DOWNLOAD_PROXY_OFF


CUSTOM_FUNCTIONS.CMD

:DOWNLOAD_FILE
    rem BITSADMIN COMMAND FOR DOWNLOADING FILES:
    bitsadmin /transfer mydownloadjob /download /priority FOREGROUND %1 %2
GOTO :EOF

:DOWNLOAD_PROXY_ON
    rem FUNCTION FOR USING A PROXY SERVER:
    bitsadmin /setproxysettings mydownloadjob OVERRIDE %1 "<local>"
GOTO :EOF

:DOWNLOAD_PROXY_OFF
    rem FUNCTION FOR STOP USING A PROXY SERVER:
    bitsadmin /setproxysettings mydownloadjob NO_PROXY
GOTO :EOF

DOWNLOAD-EXAMPLE.CMD

@ECHO OFF
SETLOCAL

rem FOR DOWNLOADING FILES, THIS SCRIPT IS USING THE "BITSADMIN.EXE" SYSTEM FILE.
rem IT IS PRESENT ON MOST WINDOWS VERSION, PROBABLY FROM WINDOWS XP TO WINDOWS 10.


:SETUP

rem URL (5MB TEST FILE):
SET "FILE_URL=http://ipv4.download.thinkbroadband.com/5MB.zip"

rem SAVE IN CUSTOM LOCATION:
rem SET "SAVING_TO=C:\Folder\5MB.zip"

rem SAVE IN THE CURRENT DIRECTORY
SET "SAVING_TO=5MB.zip"
SET "SAVING_TO=%~dp0%SAVING_TO%"

:MAIN

ECHO.
ECHO DOWNLOAD SCRIPT EXAMPLE
ECHO.
ECHO FILE URL: "%FILE_URL%"
ECHO SAVING TO:  "%SAVING_TO%"
ECHO.

rem UNCOMENT AND MODIFY THE NEXT LINE IF YOU NEED TO USE A PROXY SERVER:
rem CALL :DOWNLOAD_PROXY_ON "PROXY-SERVER.COM:8080"

rem THE MAIN DOWNLOAD COMMAND:
CALL :DOWNLOAD_FILE "%FILE_URL%" "%SAVING_TO%"

rem UNCOMMENT NEXT LINE FOR DISABLING THE PROXY (IF YOU USED IT):
rem CALL :DOWNLOAD_PROXY_OFF

:RESULT
ECHO.
IF EXIST "%SAVING_TO%" ECHO YOUR FILE HAS BEEN SUCCESSFULLY DOWNLOADED.
IF NOT EXIST "%SAVING_TO%" ECHO ERROR, YOUR FILE COULDN'T BE DOWNLOADED.
ECHO.

:EXIT_SCRIPT
PAUSE
EXIT /B




rem FUNCTIONS SECTION


:DOWNLOAD_FILE
    rem BITSADMIN COMMAND FOR DOWNLOADING FILES:
    bitsadmin /transfer mydownloadjob /download /priority FOREGROUND %1 %2
GOTO :EOF

:DOWNLOAD_PROXY_ON
    rem FUNCTION FOR USING A PROXY SERVER:
    bitsadmin /setproxysettings mydownloadjob OVERRIDE %1 "<local>"
GOTO :EOF

:DOWNLOAD_PROXY_OFF
    rem FUNCTION FOR STOP USING A PROXY SERVER:
    bitsadmin /setproxysettings mydownloadjob NO_PROXY
GOTO :EOF

1
回答を更新しました...どうやら、ダウンロード速度がめちゃくちゃ遅いので、パラメータを「/ priority normal」から「/ priority foreground」に変更して問題を修正しました。これで、使用可能な帯域幅の100%が使用されます。(代わりに〜5%)
フランクアインシュタイン

11
' Create an HTTP object
myURL = "http://www.google.com"
Set objHTTP = CreateObject( "WinHttp.WinHttpRequest.5.1" )

' Download the specified URL
objHTTP.Open "GET", myURL, False
objHTTP.Send
intStatus = objHTTP.Status

If intStatus = 200 Then
  WScript.Echo " " & intStatus & " A OK " +myURL
Else
  WScript.Echo "OOPS" +myURL
End If

その後

C:\>cscript geturl.vbs
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.

200 A OK http://www.google.com

またはそれをダブルクリックしてウィンドウでテストする


1
これはメモリへのダウンロードのみで、ファイルへの書き込みはまだ行われていません。ファイルへのダウンロードについては、この回答を確認してください:stackoverflow.com/a/2973344/977804
Daniel

5

AFAIK、Windowsには、ファイルをダウンロードするための組み込みのコマンドラインツールがありません。ただし、VBScriptから実行でき、エコーと出力リダイレクトを使用してバッチからVBScriptファイルを生成できます。

@echo off

rem Windows has no built-in wget or curl, so generate a VBS script to do it:
rem -------------------------------------------------------------------------
set DLOAD_SCRIPT=download.vbs
echo Option Explicit                                                    >  %DLOAD_SCRIPT%
echo Dim args, http, fileSystem, adoStream, url, target, status         >> %DLOAD_SCRIPT%
echo.                                                                   >> %DLOAD_SCRIPT%
echo Set args = Wscript.Arguments                                       >> %DLOAD_SCRIPT%
echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1")              >> %DLOAD_SCRIPT%
echo url = args(0)                                                      >> %DLOAD_SCRIPT%
echo target = args(1)                                                   >> %DLOAD_SCRIPT%
echo WScript.Echo "Getting '" ^& target ^& "' from '" ^& url ^& "'..."  >> %DLOAD_SCRIPT%
echo.                                                                   >> %DLOAD_SCRIPT%
echo http.Open "GET", url, False                                        >> %DLOAD_SCRIPT%
echo http.Send                                                          >> %DLOAD_SCRIPT%
echo status = http.Status                                               >> %DLOAD_SCRIPT%
echo.                                                                   >> %DLOAD_SCRIPT%
echo If status ^<^> 200 Then                                            >> %DLOAD_SCRIPT%
echo    WScript.Echo "FAILED to download: HTTP Status " ^& status       >> %DLOAD_SCRIPT%
echo    WScript.Quit 1                                                  >> %DLOAD_SCRIPT%
echo End If                                                             >> %DLOAD_SCRIPT%
echo.                                                                   >> %DLOAD_SCRIPT%
echo Set adoStream = CreateObject("ADODB.Stream")                       >> %DLOAD_SCRIPT%
echo adoStream.Open                                                     >> %DLOAD_SCRIPT%
echo adoStream.Type = 1                                                 >> %DLOAD_SCRIPT%
echo adoStream.Write http.ResponseBody                                  >> %DLOAD_SCRIPT%
echo adoStream.Position = 0                                             >> %DLOAD_SCRIPT%
echo.                                                                   >> %DLOAD_SCRIPT%
echo Set fileSystem = CreateObject("Scripting.FileSystemObject")        >> %DLOAD_SCRIPT%
echo If fileSystem.FileExists(target) Then fileSystem.DeleteFile target >> %DLOAD_SCRIPT%
echo adoStream.SaveToFile target                                        >> %DLOAD_SCRIPT%
echo adoStream.Close                                                    >> %DLOAD_SCRIPT%
echo.                                                                   >> %DLOAD_SCRIPT%
rem -------------------------------------------------------------------------

cscript //Nologo %DLOAD_SCRIPT% http://example.com targetPathAndFile.html

詳細はこちら


別のファイルでこれを行わず、単にバッチからVBScriptファイルを呼び出す理由は何ですか?編集する必要がある場合、これはひどい混乱になります。
seadoggie01 2017

4
  1. ここからWgetをダウンロードhttp://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe

  2. 次に、それをインストールします。

  3. 次にいくつかの.batファイルを作成し、これをそれに入れます

    @echo off
    
    for /F "tokens=2,3,4 delims=/ " %%i in ('date/t') do set y=%%k
    for /F "tokens=2,3,4 delims=/ " %%i in ('date/t') do set d=%%k%%i%%j
    for /F "tokens=5-8 delims=:. " %%i in ('echo.^| time ^| find "current" ') do set t=%%i%%j
    set t=%t%_
    if "%t:~3,1%"=="_" set t=0%t%
    set t=%t:~0,4%
    set "theFilename=%d%%t%"
    echo %theFilename%
    
    
    cd "C:\Program Files\GnuWin32\bin"
    wget.exe --output-document C:\backup\file_%theFilename%.zip http://someurl/file.zip
    
  4. スクリプトのURLとファイルパスを調整する

  5. ファイルを実行して利益を上げましょう!


3

bitsadminが一杯でない場合は、次のPowerShellコマンドを使用できます。

Start-BitsTransfer -Source http://www.foo.com/package.zip -Destination C:\somedir\package.zip

.exeをダウンロードしたいのですが、このコードも使用していて機能しません。バッチスクリプトを使用して.exeをダウンロードできますか?
MAS。ジョン

3

Bat To Exe Converterを使用

するバッチファイルを作成し、以下のコードのようなものをそれに入れます

%extd% /download http://www.examplesite.com/file.zip file.zip

または

%extd% /download http://stackoverflow.com/questions/4619088/windows-batch-file-file-download-from-a-url thistopic.html

そしてそれをexeに変換します。


3

wgetの代わりに、aria2を使用して特定のURLからファイルをダウンロードすることもできます。

aria2について詳しく説明する次のリンクを参照してください。

https://aria2.github.io/


まだ知らなかったこのツールについて言及した場合の+1。wgetのようにHTTPSで問題が発生している(CAチェーンをセットアップする方法がまだ見つからない)
Jeroen Wiert Pluimers 14年

2

BATCHではこれができない場合がありますが、デフォルトでWindowsにインストールされていないツールを使用したくない場合は、JScriptまたはVBScriptを使用できます。

このページの最初の例では、VBScriptでバイナリファイルをダウンロードします。http//www.robvanderwoude.com/vbstech_internet_download.php

このSOの答えは、JScript(IMO、より優れた言語)を使用してファイルをダウンロードします 。WindowsScript Host(jscript):バイナリファイルをダウンロードするにはどうすればよいですか?

バッチスクリプトは、ファイルをダウンロードするJScriptまたはVBScriptを呼び出すだけです。


2

これは動作するはずですが、ゲームサーバープロジェクトに対して次のことを行いました。zipをダウンロードして、指定したディレクトリに展開します。

name.batまたはname.cmdとして保存

@echo off
set downloadurl=http://media.steampowered.com/installer/steamcmd.zip
set downloadpath=C:\steamcmd\steamcmd.zip
set directory=C:\steamcmd\
%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe -Command "& {Import-Module BitsTransfer;Start-BitsTransfer '%downloadurl%' '%downloadpath%';$shell = new-object -com shell.application;$zip = $shell.NameSpace('%downloadpath%');foreach($item in $zip.items()){$shell.Namespace('%directory%').copyhere($item);};remove-item '%downloadpath%';}"
echo download complete and extracted to the directory.
pause

オリジナル:https : //github.com/C0nw0nk/SteamCMD-AutoUpdate-Any-Gameserver/blob/master/steam.cmd


.exeをダウンロードしたいのですが、このコードを使用して機能しませんでした。バッチスクリプトを使用して.exeをダウンロードできますか?
MAS。ジョン

1

私はこのVBスクリプトを見つけました:

http://www.olafrv.com/?p=385

魅力のように機能します。非常に単純な関数呼び出しを使用して関数として構成されます。

SaveWebBinary "http://server/file1.ext1", "C:/file2.ext2"

元の場所:http : //www.ericphelps.com/scripting/samples/BinaryDownload/index.htm

冗長性の完全なコードは次のとおりです。

Function SaveWebBinary(strUrl, strFile) 'As Boolean
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Const ForWriting = 2
Dim web, varByteArray, strData, strBuffer, lngCounter, ado
    On Error Resume Next
    'Download the file with any available object
    Err.Clear
    Set web = Nothing
    Set web = CreateObject("WinHttp.WinHttpRequest.5.1")
    If web Is Nothing Then Set web = CreateObject("WinHttp.WinHttpRequest")
    If web Is Nothing Then Set web = CreateObject("MSXML2.ServerXMLHTTP")
    If web Is Nothing Then Set web = CreateObject("Microsoft.XMLHTTP")
    web.Open "GET", strURL, False
    web.Send
    If Err.Number <> 0 Then
        SaveWebBinary = False
        Set web = Nothing
        Exit Function
    End If
    If web.Status <> "200" Then
        SaveWebBinary = False
        Set web = Nothing
        Exit Function
    End If
    varByteArray = web.ResponseBody
    Set web = Nothing
    'Now save the file with any available method
    On Error Resume Next
    Set ado = Nothing
    Set ado = CreateObject("ADODB.Stream")
    If ado Is Nothing Then
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set ts = fs.OpenTextFile(strFile, ForWriting, True)
        strData = ""
        strBuffer = ""
        For lngCounter = 0 to UBound(varByteArray)
            ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1)))
        Next
        ts.Close
    Else
        ado.Type = adTypeBinary
        ado.Open
        ado.Write varByteArray
        ado.SaveToFile strFile, adSaveCreateOverWrite
        ado.Close
    End If
    SaveWebBinary = True
End Function

1

この質問はここで非常に良い答えを持っています。私のコードは、いくつかの変更を加えた純粋にその答えに基づいています。

以下のスニペットをwget.batとして保存し、システムパスに配置します(例:ディレクトリに配置し、このディレクトリをシステムパスに追加します)。

次のようにCLIで使用できます。

wget url/to/file [?custom_name]

どこをurl_to_file強制され、custom_nameオプションであります

  1. 名前を指定しない場合、ダウンロードしたファイルは、URLからの独自の名前で保存されます。
  2. 名前が指定されている場合、ファイルは新しい名前で保存されます。

ファイルのURLと保存されたファイル名は、ANSIカラーのテキストで表示されます。それが問題を引き起こしている場合は、この githubプロジェクトを確認してください。

@echo OFF
setLocal EnableDelayedExpansion
set Url=%1
set Url=!Url:http://=!
set Url=!Url:/=,!
set Url=!Url:%%20=?!
set Url=!Url: =?!

call :LOOP !Url!

set FileName=%2
if "%2"=="" set FileName=!FN!

echo.
echo.Downloading: [1;33m%1[0m to [1;33m\!FileName![0m

powershell.exe -Command wget %1 -OutFile !FileName!

goto :EOF
:LOOP
if "%1"=="" goto :EOF
set FN=%1
set FN=!FN:?= !
shift
goto :LOOP

PSこのコードでは、PowerShellをインストールする必要があります。


1

wgetを使用してスケジュールされたタスクを設定できます。スケジュールされたタスクの「実行」フィールドを次のように使用します。

C:\wget\wget.exe -q -O nul "http://www.google.com/shedule.me"

1

Windowsには、CMDから実行できるユーティリティ(CMDに常駐)があります(書き込みアクセス権がある場合)。

set url=https://www.nsa.org/content/hl-images/2017/02/09/NSA.jpg
set file=file.jpg
certutil -urlcache -split -f %url% %file%
echo Done.

組み込みのWindowsアプリケーション。外部ダウンロードの必要はありません。

Win 10でテスト済み


-3

ftpを使用:

(ftp *yourewebsite.com*-a)
cd *directory*
get *filename.doc*
close

アスタリスクのすべてを状況に合わせて変更します。


FTPをサポートするファイルをホストしているサーバーに確実に依存しています。
PnP 2015

Questinはftpではなくhttpに関連しています
Ben
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.