3

I would to dowload a file from a .bat script in Windows 7, and put it into current folder (where the script is).

I tried in this way, with no (good) results:

    SET FILENAME = "name.ext"
    bitsadmin.exe /transfer "JobName" http://www.someurl.com/file.ext %cd%%FILENAME%

I got this:

    Unable to add file - 0x80070005

Why? I suppose that string concat fails

(I know that bitsadmin is deprecated in Win7)

Thank you in advance!

dar0x
  • 351
  • 2
  • 6
  • 10
  • What exact folder are you trying to write to? It's possible that BITS is running as a limited user that isn't allowed to write to that folder. – nobody Sep 08 '14 at 20:09
  • @AndrewMedico user is allowed to write there. It was a syntax problem. Thank you – dar0x Sep 09 '14 at 18:48

6 Answers6

5

Your problem was the spaces on either side of the equals sign. They get included in both the variable name and in the contents of the variable - plus the lack of the backslash that you found.

Test this:

@echo off
SET "FILENAME=%~dp0\name.ext"
bitsadmin.exe /transfer "JobName" http://www.someurl.com/file.ext "%FILENAME%"

EDIT: In case you are executing this as admin, try the edited code above.
because when running with elevated permissions then the working directory changes.

Please report all error messages when you say that something doesn't work, so the problem can be worked out.

foxidrive
  • 37,659
  • 8
  • 47
  • 67
  • It seems to not work properly. I tried SET "FILENAME=name.ext" and SET FILENAME="name.ext" – dar0x Sep 22 '14 at 12:49
4

powershell

start-bitstransfer -source protocol://url.host/url.path -destination C:\destination\file.ext

from cmd env

powershell -command "start-bitstransfer -source protocol://url.host/url.path -destination C:\destination\file.ext"

reference

Valen
  • 1,242
  • 1
  • 15
  • 15
2

EDIT - How can I download a file with batch file without using any external tools?

I think Bitsadmin does not work with relative paths and you need to add full name to the local file.

You can check also my bitsadmin script thats spends a lot of dirty work - it accepts two arguments url and the path to the local file (and a timeout number - default is 5).As you can see the it pre-pend %CD% to the local file name:

   @echo off
    setlocal
   :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

You can check also this jscript.net self compiled hybrid (save it as .bat):

@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"
::::::::
::

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
  • theres no need to parse the whole summary from the /info switch. the /GetState switch retrieves the state of the specified job – Jan Viehweger Feb 26 '17 at 22:31
1

I solved on my own, without using FILENAME variable:

    bitsadmin.exe /transfer "JobName" http://www.someurl.com/file.ext "%cd%\name.ext"
dar0x
  • 351
  • 2
  • 6
  • 10
0

Just use Powershell it wont be a problem.

@echo off
setlocal enabledelayedexpansion
set _wdraft=%~dp0file.txt
set _dlwebf=http://df291a01bce923.sampledl.com/d/file.txt
Powershell -Command "(New-Object Net.WebClient).DownloadFile('%_dlwebf%','%_wdraft%')"
endlocal

This may take up to 20 seconds, more or less depending on the file size.

scriptmastere02
  • 357
  • 2
  • 12
-2
@echo off
SET "FILENAME=%~dp0\name.ext"
bitsadmin.exe /transfer "JobName" http://www.someurl.com/file.ext "%FILENAME%"
pause

This one works. Just change the line

SET "FILENAME=%~dp0\name.ext" 

to

SET "FILENAME=%~dp0\Your File Name"