从URL下载Windows批处理文件

从URL下载Windows批处理文件,windows,batch-file,download,scripting,Windows,Batch File,Download,Scripting,我正在尝试使用Windows批处理文件从网站(例如)下载文件。我在编写下面的函数时收到一个错误代码: xcopy /E /Y "http://www.example.com/package.zip" 批处理文件似乎不喜欢http后面的“/”。有没有办法转义这些字符,这样就不会假定它们是函数参数?您不能通过http使用xcopy。尝试下载wget for windows。这可能会奏效。它是一个用于通过http非交互式下载文件的命令行实用程序。您可以在上一次我检查时,没有命令行命令从MS命令行连接

我正在尝试使用Windows批处理文件从网站(例如)下载文件。我在编写下面的函数时收到一个错误代码:

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

批处理文件似乎不喜欢http后面的“/”。有没有办法转义这些字符,这样就不会假定它们是函数参数?

您不能通过http使用xcopy。尝试下载wget for windows。这可能会奏效。它是一个用于通过http非交互式下载文件的命令行实用程序。您可以在

上一次我检查时,没有命令行命令从MS命令行连接到URL。尝试wget for Windows:

或URL2File:

在Linux中,可以使用“wget”

或者,您可以尝试VBScript。它们类似于命令行程序,但它们是由wscript.exe脚本主机解释的脚本。以下是使用VBS下载文件的示例:
使用ftp:

(ftp *yourewebsite.com*-a)
cd *directory*
get *filename.doc*
close

更改星号中的所有内容以适应您的情况。

BATCH可能无法执行此操作,但如果您不想使用默认情况下未随Windows安装的工具,可以使用JScript或VBScript

本页的第一个示例下载VBScript中的二进制文件:

这个答案使用JScript(IMO,更好的语言)下载一个文件:

然后,批处理脚本可以调用下载该文件的JScript或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
然后

或者双击它在windows中进行测试

  • 从这里下载Wget

  • 然后安装它

  • 然后制作一些.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和文件路径

  • 运行文件和利润
    您可以使用wget设置计划任务,将计划任务中的“运行”字段用作:

    C:\wget\wget.exe -q -O nul "http://www.google.com/shedule.me"
    

    这可能有点离题,但您可以使用Powershell轻松下载文件。Powershell附带现代版本的Windows,因此您不必在计算机上安装任何额外的东西。我通过阅读本页了解了如何做到这一点:

    代码是:

    $webclient = New-Object System.Net.WebClient
    $url = "http://www.example.com/file.txt"
    $file = "$pwd\file.txt"
    $webclient.DownloadFile($url,$file)
    

    我发现这个VB脚本:

    工作起来很有魅力。配置为具有非常简单的函数调用的函数:

    SaveWebBinary "http://server/file1.ext1", "C:/file2.ext2"
    
    原籍:

    以下是冗余的完整代码:

    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
    
    函数SaveWebBinary(strUrl,strFile)”作为布尔值
    常量adTypeBinary=1
    常量adSaveCreateOverWrite=2
    写入常数=2
    Dim-web、varByteArray、strData、strBuffer、lngCounter、ado
    出错时继续下一步
    '下载包含任何可用对象的文件
    呃,明白了
    设置web=Nothing
    设置web=CreateObject(“WinHttp.WinHttpRequest.5.1”)
    如果web为空,则设置web=CreateObject(“WinHttp.WinHttpRequest”)
    如果web为空,则设置web=CreateObject(“MSXML2.ServerXMLHTTP”)
    如果web为空,则设置web=CreateObject(“Microsoft.XMLHTTP”)
    web.Open“GET”,strURL,False
    发送
    如果错误号为0,则
    SaveWebBinary=False
    设置web=Nothing
    退出功能
    如果结束
    如果web.Status为“200”,则
    SaveWebBinary=False
    设置web=Nothing
    退出功能
    如果结束
    varByteArray=web.ResponseBody
    设置web=Nothing
    '现在使用任何可用方法保存文件
    出错时继续下一步
    设置ado=Nothing
    设置ado=CreateObject(“ADODB.Stream”)
    如果ado不算什么的话
    设置fs=CreateObject(“Scripting.FileSystemObject”)
    设置ts=fs.OpenTextFile(strFile,ForWriting,True)
    strData=“”
    strBuffer=“”
    对于lngCounter=0至UBound(varByteArray)
    写入Chr(255和Ascb(Midb(varByteArray,lngCounter+1,1)))
    下一个
    关闭
    其他的
    ado.Type=adTypeBinary
    阿多,开门
    ado.写varByteArray
    ado.SaveToFile strFile,adSaveCreateOverWrite
    阿多,结束
    如果结束
    SaveWebBinary=True
    端函数
    
    好吧,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
    
    @echo关闭
    rem Windows没有内置的wget或curl,因此请生成VBS脚本:
    雷姆-------------------------------------------------------------------------
    设置DLOAD_SCRIPT=download.vbs
    显式回显选项>%DLOAD\u脚本%
    echo Dim参数、http、文件系统、adoStream、url、目标、状态>>%DLOAD\u脚本%
    回声。>>%加载脚本%
    echo Set args=Wscript.Arguments>>%d加载脚本%
    echo Set http=CreateObject(“WinHttp.WinHttpRequest.5.1”)>>%DLOAD\u脚本%
    echo url=args(0)>>%DLOAD\u脚本%
    echo target=args(1)>>%DLOAD\u脚本%
    echo WScript.echo“获取”^&target^&“来自”^&url^&“…”>%DLOAD\u脚本%
    回声。>>%加载脚本%
    回显http。打开“获取”,url,错误>>%DLOAD\u脚本%
    回显http.Send>>%DLOAD\u脚本%
    echo status=http.status>>%d加载脚本%
    回声。>>%加载脚本%
    如果状态为^200,则回显>>%DLOAD\u脚本%
    echo WScript.echo“未能下载:HTTP状态”^&Status>>%DLOAD\u脚本%
    echo WScript.Quit 1>>%d加载脚本%
    如果>>%DLOAD\u脚本%
    回声。>>%加载脚本%
    回声集音频流=
    
    @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
    
    bitsadmin.exe /transfer "JobName" http://download.url/here.exe C:\destination\here.exe
    
    (New-Object Net.WebClient).DownloadFile('http://www.example.com/package.zip', 'package.zip')
    
    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"
    
    @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
    
    Start-BitsTransfer -Source http://www.foo.com/package.zip -Destination C:\somedir\package.zip
    
    %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
    
    @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
    
    :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
    GOTO :EOF
    
    :DOWNLOAD_PROXY_OFF
        rem FUNCTION FOR STOP USING A PROXY SERVER:
        bitsadmin /setproxysettings mydownloadjob NO_PROXY
    GOTO :EOF
    
    @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
    GOTO :EOF
    
    :DOWNLOAD_PROXY_OFF
        rem FUNCTION FOR STOP USING A PROXY SERVER:
        bitsadmin /setproxysettings mydownloadjob NO_PROXY
    GOTO :EOF
    
    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.
    
    curl "https://download.sysinternals.com/files/PSTools.zip" --output pstools.zip
    
    set "download=bitsadmin /transfer myDownloadJob /download /priority normal"
    %download% "https://download.sysinternals.com/files/PSTools.zip" %cd%\pstools.zip
    
    call winhhtpjs.bat "https://example.com/files/some.zip" -saveTo "c:\somezip.zip"