2

I need to create some script (maybe .bat/.vbs or something else) that will download and open the file on double-click.

How can I do this?

Example: I double-click on file (run.bat) and it goes to the link: http://download.teamviewer.com/download/TeamViewer_Setup_en.exe download and install this file.

I've tried something like this:

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET", "http://download.teamviewer.com/download/TeamViewer_Setup_en.exe", 0 
oXMLHTTP.Send
Set oADOStream = CreateObject("ADODB" & ".Stream")
oADOStream.Mode = 3
oADOStream.Type = 1
oADOStream.Open
oADOStream.Write oXMLHTTP.responseBody
oADOStream.SaveToFile "C:\TeamViewer_Setup_en.exe", 2 
dim path, WshShell
path = "C:\"
set WshShell = WScript.CreateObject("Wscript.Shell")
WshShell.Run path & "TeamViewer_Setup_en.exe", ,true

But it didn't work.

Alex.K.
  • 3,342
  • 13
  • 38
  • 44
Bazinga
  • 23
  • 1
  • 4
  • 1
    How *exactly* did it "not work"? – Ansgar Wiechers Nov 14 '14 at 12:20
  • 1
    It worked for me. If by "not work" you mean you're getting an "Access Denied" error, see @AnsgarWiechers's answer [here](http://stackoverflow.com/a/17402920/2237785). Also, why the concatenation of string _literals_!? `("ADODB" & ".Stream"`) – Bond Nov 14 '14 at 13:38

1 Answers1

1

EDIT : How can I download a file with batch file without using any external tools?
More detailed answer of how files can be downloaded from internet in windows.

Here are two ways.The first uses bitsadmin.exe and the second hybrid jscript.net/bat (should be saved as .bat).The .net way is faster according to my tests , but creates a small .exe file that is called.And the second is a "pure" batch script.

  @echo off
    setlocal

    call :download "http://download.teamviewer.com/download/TeamViewer_Setup_en.exe" teamv.exe
    teamv.exe
    exit /b %errorlevel%
    :download

    if "%2" equ "" (
        call :help
        exit /b 5
    )

    if "%1" equ "" (
        call :help
        exit /b 6
    )
    set url=%~1
    set file=%~2
    rem ----
    if "%~3" NEQ "" (
        set /A timeout=%~3
    ) else (
        set timeout=5
    )

    bitsadmin /cancel download >nul
    bitsadmin /create /download download >nul 
    call bitsadmin /addfile download "%url%" "%CD%\%file%" >nul
    bitsadmin /resume download >nul 
    bitsadmin /setproxysettings download AUTODETECT >nul

    set /a attempts=0
    :repeat
    set /a attempts +=1
    if "%attempts%" EQU "10" (
        echo TIMED OUT
        endlocal
        exit /b 1
    )
    bitsadmin /info download /verbose | find  "STATE: ERROR"  >nul 2>&1 && endlocal &&  bitsadmin /cancel download && echo SOME KIND OF ERROR && exit /b 2
    bitsadmin /info download /verbose | find  "STATE: SUSPENDED" >nul 2>&1 && endlocal &&  bitsadmin /cancel download &&echo FILE WAS NOT ADDED && exit /b 3
    bitsadmin /info download /verbose | find  "STATE: TRANSIENT_ERROR" >nul 2>&1 && endlocal &&  bitsadmin /cancel download &&echo TRANSIENT ERROR && exit /b 4
    bitsadmin /info download /verbose | find  "STATE: TRANSFERRED" >nul 2>&1 && goto :finishing 

    w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:%timeout%  >nul 2>&1
    goto :repeat
    :finishing 
    bitsadmin /complete download >nul
    echo download finished
    endlocal
    goto :eof

    :help
    echo %~n0 url file [timeout]
    echo.
    echo  url - the source for download
    echo  file - file name in local directory where the file will be stored
    echo  timeout - number in seconds between each check if download is complete (attempts are 10)
    echo.
    goto :eof

OR

@if (@X)==(@Y) @end /****** jscript comment ******

@echo off
::::::::::::::::::::::::::::::::::::
:::       compile the script    ::::
::::::::::::::::::::::::::::::::::::
setlocal
if exist simpledownloader.exe goto :skip_compilation

set "frm=%SystemRoot%\Microsoft.NET\Framework\"
:: searching the latest installed .net framework
for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
    if exist "%%v\jsc.exe" (
        rem :: the javascript.net compiler
        set "jsc=%%~dpsnfxv\jsc.exe"
        goto :break_loop
    )
)
echo jsc.exe not found && exit /b 0
:break_loop


call %jsc% /nologo /out:"simpledownloader.exe" "%~dpsfnx0"
::::::::::::::::::::::::::::::::::::
:::       end of compilation    ::::
::::::::::::::::::::::::::::::::::::
:skip_compilation

:: download the file


::
::::::::::
:: simpledownloader.exe "%%~1" "%%~2"

simpledownloader.exe  "http://download.teamviewer.com/download/TeamViewer_Setup_en.exe" teamv2.exe
teamv.exe

:: del /q simpledownloader.exe
::
::::::::
::

exit /b 0


****** end of jscript comment ******/

import System;
var arguments:String[] = Environment.GetCommandLineArgs();
var webClient:System.Net.WebClient = new System.Net.WebClient();
print("Downloading " + arguments[1] + " to " + arguments[2]);
try {
    webClient.DownloadFile(arguments[1], arguments[2]);
} catch (e) {

        Console.BackgroundColor = ConsoleColor.Green;
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("\n\nProblem with downloading " + arguments[1] + " to " + arguments[2] + "Check if the internet address is valid");
        Console.ResetColor();
        Environment.Exit(5);
}
Community
  • 1
  • 1
npocmaka
  • 51,748
  • 17
  • 123
  • 166
  • I'm trying use the second way and it works fine, file downloads. But if i add in the end of bat file a line with run of the file then it didn't work. I also need to open the file. I've tried add start teamv2.exe after all code and in try{} after webClient.DownloadFile(arguments[1], arguments[2]); it didn't work. Why? – Bazinga Nov 14 '14 at 09:36
  • @Bazinga everything after `****** end of jscript comment ******/` is a jscript code and not part of the actual .bat file.If you want something executed at the end of the script put it before the `exit /b 0` – npocmaka Nov 14 '14 at 10:06