Загрузка файла пакетного файла 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.