Windows 배치 파일을 사용하여 웹 사이트 (예 : http://www.example.com/package.zip ) 에서 파일을 다운로드하려고 합니다. 아래 함수를 작성할 때 오류 코드가 나타납니다.
xcopy /E /Y "http://www.example.com/package.zip"
배치 파일은 http 다음에 "/"를 좋아하지 않는 것 같습니다. 해당 문자를 이스케이프하여 함수 매개 변수라고 가정하지 않는 방법이 있습니까?
Windows 배치 파일을 사용하여 웹 사이트 (예 : http://www.example.com/package.zip ) 에서 파일을 다운로드하려고 합니다. 아래 함수를 작성할 때 오류 코드가 나타납니다.
xcopy /E /Y "http://www.example.com/package.zip"
배치 파일은 http 다음에 "/"를 좋아하지 않는 것 같습니다. 해당 문자를 이스케이프하여 함수 매개 변수라고 가정하지 않는 방법이 있습니까?
답변:
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에 설치 가능)
.bat
과 .ps1
파일 을 클릭하면 작업을 망칠 수 있다는 완벽한 개념 증명이 됩니다.
수행하려는 작업을 수행 할 수있는 표준 Windows 구성 요소가 있습니다. BITS . XP 및 2000 SP3부터 Windows에 포함되었습니다.
운영:
bitsadmin.exe /transfer "JobName" http://download.url/here.exe C:\destination\here.exe
작업 이름은 다운로드 작업의 표시 이름입니다. 수행중인 작업을 설명하는 이름으로 설정하십시오.
bitsadmin
는 Windows XP Home Edition에서 사용할 수 없습니다.
이것은 약간의 주제가 아닐 수 있지만 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)
System
에System.Net.WebClient
마지막으로 확인한 결과 MS 명령 줄에서 URL에 연결하는 명령 줄 명령이 없습니다. Windows 용 wget 사용해보기 :
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
PURE BATCH에서 파일 다운로드 중 ...
어떤 사람들은 JScript 나 VBScript 등을 사용하지 않고는 배치 스크립트로 파일을 다운로드 할 수 없다고 말하고 있습니다. 그러나 그들은 확실히 틀 렸습니다!
다음은 배치 스크립트에서 파일을 다운로드하는 데 매우 잘 작동하는 간단한 방법입니다. 거의 모든 파일의 URL에서 작동합니다. 필요한 경우 프록시 서버를 사용할 수도 있습니다.
파일 다운로드 를 위해 Windows 시스템에서 BITSADMIN.EXE 를 사용할 수 있습니다 . 아무것도 다운로드 / 설치하거나 JScript 또는 VBScript 등을 사용할 필요가 없습니다. Bitsadmin.exe 는 XP에서 Windows 10까지 대부분의 Windows 버전에 있습니다.
즐겨!
용법:
다음과 같이 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 (Background Intelligent Transfer Service)"가 활성화되어 있는지 확인하고 다시 시도하십시오. (기본적으로 활성화되어 있어야합니다.)
사용자 정의 기능
Call :DOWNLOAD_FILE "URL"
Call :DOWNLOAD_PROXY_ON "SERVER:PORT"
Call :DOWNLOAD_PROXY_OFF
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
DOWNLOAD-EXAMPLE.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
' 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
또는 창에서 테스트하려면 두 번 클릭하십시오.
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
여기에 더 많은 설명
여기에서 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 및 파일 경로 조정
http를 통해 xcopy를 사용할 수 없습니다. Windows 용 wget을 다운로드하십시오. 그것은 트릭을 할 수 있습니다. http를 통한 비대화 형 파일 다운로드를위한 명령 줄 유틸리티입니다. http://gnuwin32.sourceforge.net/packages/wget.htm 에서 얻을 수 있습니다.
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로 변환하십시오.
wget 대신 aria2를 사용하여 특정 URL에서 파일을 다운로드 할 수도 있습니다.
aria2에 대한 자세한 내용은 다음 링크를 참조하십시오.
BATCH는이 작업을 수행하지 못할 수 있지만 Windows에 기본적으로 설치되지 않은 도구를 사용하지 않으려면 JScript 또는 VBScript를 사용할 수 있습니다.
이 페이지의 첫 번째 예제는 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
이 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
이 질문은 여기에 아주 좋은 대답이 있습니다 . 내 코드는 순전히 그 대답을 기반으로 약간 수정되었습니다.
아래 스 니펫을 wget.bat 로 저장 하고 시스템 경로에 넣습니다 (예 : 디렉터리에 디렉터리를 시스템 경로에 추가).
다음과 같이 cli에서 사용할 수 있습니다.
wget url/to/file [?custom_name]
url_to_file
필수이고 custom_name
선택 사항 인 곳
파일 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이 설치되어 있어야합니다.