web-dev-qa-db-ja.com

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

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

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

バッチファイルはhttpの後の "/"のようには見えません。それらが関数パラメータであると仮定しないようにそれらの文字をエスケープする方法はありますか?

93
James

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、Windows 7では3.0にインストールできます)

109
sevenforce

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

実行します。

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

ジョブ名は単にダウンロードジョブの表示名です - あなたがしていることを説明する何かにそれを設定してください。

88
brainwood

ちょっとした話題かもしれませんが、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)
29
David Grayson

最後に確認しましたが、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

25
LostInTheCode

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

JScript、VBScript、Powershellなどは含まれません。純粋なバッチのみ!

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

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

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

楽しい!


使用法:

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

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

BITSadmin.exeに関する詳細情報が必要な場合は、これをクリックしてください LINK


カスタム関数
:DOWNLOAD_FILE "URL"
:DOWNLOAD_PROXY_ON "SERVER:PORT"
: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 normal %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, 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 DOWNLOADING A PICTURE (URL):
SET "FILE_URL=https://upload.wikimedia.org/wikipedia/en/8/86/Einstein_tongue.jpg"

rem SAVING FILE TO THE SCRIPT FOLDER:
SET "SAVING_TO=Einstein_tongue.jpg"
SET "SAVING_TO=%~dp0%SAVING_TO%"

rem OR, UNCOMMENT NEXT LINE FOR SAVING TO ANY OTHER PATH:
rem SET "SAVING_TO=C:\Folder\Einstein_tongue.jpg"


:MAIN

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 HERE IS THE MAIN DOWNLOADING COMMAND:
CALL :DOWNLOAD_FILE "%FILE_URL%" "%SAVING_TO%"

rem UNCOMMENT NEXT LINE FOR DISABLING ANY PROXY:
rem CALL :DOWNLOAD_PROXY_OFF

ECHO.

rem THIS IS THE END...
PAUSE
EXIT /B




rem FUNCTIONS SECTION


:DOWNLOAD_FILE
    rem BITSADMIN COMMAND FOR DOWNLOADING FILES:
    bitsadmin /transfer mydownloadjob /download /priority normal %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
12
Frank Einstein
' 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

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

11
Kalpesh Soni

ご存知のとおり、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

さらなる説明 ここ

5
Abscissa
  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. ファイルを実行して利益を得ましょう。
4
boksiora

Httpを介してxcopyを使用することはできません。 Windows用のwgetをダウンロードしてみてください。それはトリックをするかもしれません。それはhttpを通してファイルの非対話型のダウンロードのためのコマンドラインユーティリティです。あなたはそれを得ることができます http://gnuwin32.sourceforge.net/packages/wget.htm

3
Matt Wrock

Bitsadminがお茶以外の場合は、次のPowerShellコマンドを使用できます。

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

使用 エグゼコンバーターへのバット

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

%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
kentuckyschreit

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

Aria2の詳細については、次のリンクを参照してください。

https://aria2.github.io/

2
Sasikumar

これは私がゲームサーバープロジェクトのために次のことをしたように働くべきです。 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

2
C0nw0nk

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

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

このSO answerはJScript(IMO、より良い言語)を使ってファイルをダウンロードします: Windows Script Host(jscript):どうやったらバイナリファイルをダウンロードできますか?

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

2
aikeru

この質問は ここ で非常に良い答えを得ています。私のコードは、いくつかの修正を加えた純粋な答えに基づいています。

スニペットの下にwget.batという名前で保存し、システムパスに入れます(たとえば、ディレクトリに入れてこのディレクトリをシステムパスに追加します)。

次のようにあなたのcliでそれを使うことができます:

wget url/to/file [?custom_name]

url_to_fileは必須、custom_nameはオプションです。

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

ファイルのURLと保存されたファイル名はANSI色のテキストで表示されます。それが問題を引き起こしているのなら、 this github projectをチェックしてください。

@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

P.S。このコードでは、PowerShellをインストールしておく必要があります。

1
bantya

あなたはwgetを使ってスケジュールされたタスクを設定することができます。

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

私はこの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
Beachhouse