Загрузка пакетного файла 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"
Загрузите Wget отсюда http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe
Затем установите его.
Затем создайте файл.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
Настройте URL и путь к файлу в скрипте
- Запустите файл и получите прибыль!
Используйте 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:
В 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
необязательно
- Если имя не указано, загруженный файл будет сохранен под своим именем из URL.
- Если имя указано, то файл будет сохранен под новым именем.
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:
Работает как шарм. Сконфигурирован как функция с очень простым вызовом функции:
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
Измените все в звездочках, чтобы соответствовать вашей ситуации.