Завантажити пакетний файл 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 я, до речі, помітив, що для не абсолютного цільового шляху файл буде збережений відносно домашньої папки користувача.
сім форси

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."
Пітер

1
Як я вже згадував, bitsadmin не працює в автоматичних партіях, запущених із планувальника завдань :(
TomeeNS

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

1
Все ще сильний у Windows 10 Pro
Orwellophile

3
Дякую! Працював як шарм на зараженому комп’ютері, не маючи іншого можливого способу завантаження файлу з Інтернету. (Навіть повноваження було неможливо запустити)
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

Я не думаю , що вам потрібно 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>"

Натисніть цю LINK , якщо ви хочете отримати більше інформації про 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 "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

СКАЧАТИ-ПРИКЛАД.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
Я щойно оновив свою відповідь ... Мабуть, швидкість завантаження була шалено повільною, тому я змінив параметр з "/ пріоритет нормальний" на "/ пріоритет пріоритету" і це виправило проблему. Він повинен використовувати зараз 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
Даніель

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

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 за допомогою пакетного сценарію?
МАС. Іван

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

Ця відповідь ТА завантажує файл за допомогою JScript (IMO, краща мова): Хост сценарію Windows (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 за допомогою пакетного сценарію?
МАС. Іван

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-адреса файлу та збережені імена файлів відображаються у кольорі ансі. Якщо це спричиняє проблеми для вас, перевірте цей проект 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

Кестін пов’язаний з http, а не ftp
Бен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.