Загрузка пакетного файла Windows с URL

Я пытаюсь загрузить файл с веб-сайта (например, http://www.example.com/package.zip), используя пакетный файл Windows. Я получаю код ошибки, когда пишу функцию ниже:

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

Пакетный файл не похоже на "/" после http. Есть ли способы избежать этих символов, чтобы не предполагать, что они являются параметрами функции?

18 ответов

С 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 для Windows 7)

Есть стандартный компонент Windows, который может достичь того, что вы пытаетесь сделать: биты. Он был включен в Windows с XP и 2000 SP3.

Бежать:

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

Имя задания - это просто отображаемое имя для задания на загрузку - установите для него что-то, что описывает то, что вы делаете.

Это может быть немного не по теме, но вы можете довольно легко загрузить файл с помощью 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)

Загрузка файлов в PURE BATCH...

Без каких-либо JScript, VBScript, Powershell и т. Д.... Только чистый пакет!

Некоторые люди говорят, что невозможно скачивать файлы с помощью пакетного скрипта без использования JScript или VBScript и т. Д. Но они определенно ошибаются!

Вот простой метод, который, кажется, хорошо работает для загрузки файлов в ваших пакетных сценариях. Он должен работать практически по любому URL файла. Можно даже использовать прокси-сервер, если вам это нужно.

Для загрузки файлов мы можем использовать BITSADMIN.EXE из системы Windows. Нет необходимости загружать / устанавливать что-либо или использовать какой-либо 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


ТАМОЖЕННЫЕ ФУНКЦИИ
:DOWNLOAD_FILE "URL"
:DOWNLOAD_PROXY_ON "SERVER:PORT"
:DOWNLOAD_PROXY_OFF

Я сделал эти 3 функции для упрощения команд bitadmin. Это проще в использовании и запоминании. Это может быть особенно полезно, если вы используете его несколько раз в своих скриптах.

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ...
Перед использованием этих функций вам необходимо сначала скопировать их из CUSTOM_FUNCTIONS.CMD в конец вашего скрипта. Есть также полный пример: DOWNLOAD-EXAMPLE.CMD

: DOWNLOAD_FILE "URL"
Основная функция, будет скачивать файлы с URL.

: DOWNLOAD_PROXY_ON "СЕРВЕР: ПОРТ"
(Необязательно) Вы можете использовать эту функцию, если вам нужно использовать прокси-сервер.
Вызов функции: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

ЗАГРУЗКИ 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

Последнее, что я проверил, нет команды командной строки для подключения к URL из командной строки MS. Попробуйте wget для Windows:
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

' 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

или просто дважды щелкните по нему, чтобы проверить в Windows

AFAIK, Windows не имеет встроенного инструмента командной строки для загрузки файла. Но вы можете сделать это из VBScript и сгенерировать файл VBScript из пакета, используя echo и перенаправление вывода:

@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

Больше объяснений здесь

CURL

В сборке 17063 Windows 10 была добавлена ​​утилита CURL. Чтобы скачать файл, вы можете использовать:

curl "https://download.sysinternals.com/files/PSTools.zip" --output pstools.zip

BITSADMIN

Может быть проще использовать bitsadmin с макросом:

set "download=bitsadmin /transfer myDownloadJob /download /priority normal"
%download% "https://download.sysinternals.com/files/PSTools.zip" %cd%\pstools.zip

Объекты Winhttp com

Для обратной совместимости вы можете использовать winhttpjs.bat (с ним вы также можете выполнять POST,DELETE и другие методы http):

call winhhtpjs.bat "https://example.com/files/some.zip" -saveTo "c:\somezip.zip" 
  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. Запустите файл и получите прибыль!

Используйте Bat To Exe Converter

Создайте командный файл и поместите в него что-то вроде кода ниже

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

или же

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

и преобразовать его в exe.

Если битсадмин не ваша чашка чая, вы можете использовать эту команду PowerShell:

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

Вместо wget вы также можете использовать aria2 для загрузки файла с определенного URL.

Смотрите следующую ссылку, которая расскажет больше о aria2:

https://aria2.github.io/

В 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

Вы не можете использовать xcopy через http. Попробуйте скачать Wget для Windows. Это может сделать свое дело. Это утилита командной строки для неинтерактивной загрузки файлов через http. Вы можете получить его на http://gnuwin32.sourceforge.net/packages/wget.htm

BATCH может быть не в состоянии сделать это, но вы можете использовать JScript или VBScript, если вы не хотите использовать инструменты, которые не установлены по умолчанию в Windows.

Первый пример на этой странице загружает двоичный файл в VBScript: http://www.robvanderwoude.com/vbstech_internet_download.php

Этот SO-ответ загружает файл с использованием JScript (IMO, лучший язык): Windows Script Host (jscript): как загрузить двоичный файл?

Затем ваш пакетный скрипт может просто вызвать JScript или VBScript, который загружает файл.

Это должно работать, я сделал следующее для проекта игрового сервера. Он загрузит 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

Вы можете настроить запланированное задание с помощью wget, используйте поле "Выполнить" в запланированном задании как:

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

На этот вопрос очень хороший ответ. Мой код основан исключительно на этом ответе с некоторыми изменениями.

Сохраните приведенный ниже фрагмент как wget.bat и поместите его в системный путь (например, поместите его в каталог и добавьте этот каталог в системный путь).

Вы можете использовать его в вашем клие следующим образом:

wget url/to/file [?custom_name]

где url_to_file является обязательным и custom_name необязательно

  1. Если имя не указано, загруженный файл будет сохранен под своим именем из URL.
  2. Если имя указано, то файл будет сохранен под новым именем.

URL файла и сохраненные имена файлов отображаются в цветном тексте. Если это вызывает у вас проблемы, проверьте этот проект на 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.

Я нашел этот скрипт 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

Используйте ftp:

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

Измените все в звездочках, чтобы соответствовать вашей ситуации.

Другие вопросы по тегам