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


113

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

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

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


Здесь: stackoverflow.com/questions/28143160/… Я попытался возобновить способы загрузки файлов в Windows с использованием только собственных инструментов без стороннего программного обеспечения.
— npocmaka

Ответы:


137

С 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)


2
Прохладно! Лучше, чем bitsadmin.exe, потому что он не является устаревшим.
— sinelaw

@sevenforce, команда Powershell 2.0 также работает в Powershell 3.0, или вам нужно использовать этот синтаксис Powershell 3.0?
— Рич Сигнелл,

4
@RichSignell: команда 2.0 также работает в версии 3.0. Для команды 2.0 я, кстати, заметил, что для неабсолютного целевого пути файл будет сохранен относительно домашней папки пользователя.
— sevenforce

1
Это потрясающе. Я так долго это искал. Спасибо! По-прежнему работает в 2017 году.
— Альберт М.Н.

2
Код 2.0 работает для меня на последней версии Win 7. И поскольку он также работает без предоставления прав администратора PowerShell, пусть это будет прекрасным доказательством того, что нажатие на неизвестное .batи .ps1файлы может действительно испортить ваши вещи.
— 1934286

97

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

Бегать:

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

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


14
Хороший инструмент! Но мой win8 говорит: «BITSAdmin устарел и не гарантируется, что будет доступен в будущих версиях Windows. Инструменты администрирования для службы BITS теперь предоставляются командлетами BITS PowerShell».
— Питер 08

1
Как я уже упоминал, битсадмин не работает при автоматическом запуске пакетов из планировщика задач :(
— TomeeNS

1
@cmroanirgo bitsadminнедоступен в Windows XP Home Edition.
— каскадный стиль

1
По-прежнему сильна в Windows 10 Pro
— Orwellophile

3
Спасибо! Работал как амулет на зараженном компьютере, и у него не было другого способа загрузить файл из Интернета. (Даже
— Powershell

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, которые упрощают работу с новой версией PowerShell 3.0
— juFo

Я не думаю , что вам нужно SystemвSystem.Net.WebClient
— 1934286

25

В последний раз я проверял, что нет команды командной строки для подключения к 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:
/server/29707/download-file-from-vbscript


2
Вам не нужен wget или сторонняя интеграция. BITS (стандартный компонент Windows начиная с XP) может делать это с помощью утилиты bitsadmin из командной строки MS. Ответ опубликован - хотя и с некоторым опозданием (на 2 года позади?)
— brainwood

18

Загрузка файлов в 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 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

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

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ ...
Перед использованием этих функций вам сначала нужно скопировать их из 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 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

СКАЧАТЬ-ПРИМЕР.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

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


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 06

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

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


3

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

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

Я хочу скачать .exe, и я тоже использовал этот код, но не работал .. Могу ли я загрузить .exe с помощью пакетного скрипта?
— МАС. John

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 за упоминание этого инструмента, о котором я еще не знал. Жаль, что у него проблемы с HTTPS, как у wget (еще не нашел способ настроить цепочку CA)
— Jeroen Wiert Pluimers

2

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

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

Этот SO-ответ загружает файл с использованием JScript (IMO, лучший язык): Windows Script 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 с помощью пакетного сценария?
— МАС. John

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 и поместите его в системный путь (например, поместите его в каталог и добавьте этот каталог в системный путь.)

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

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

Questin связан с http, а не с ftp
— Бен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.