Reputation: 361
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!
Upvotes: 3
Views: 25998
Reputation: 613
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.
Upvotes: 0
Reputation: 1
@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"
Upvotes: -2
Reputation: 1763
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"
Upvotes: 4
Reputation: 57262
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);
}
Upvotes: 2
Reputation: 41234
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.
Upvotes: 5
Reputation: 361
I solved on my own, without using FILENAME variable:
bitsadmin.exe /transfer "JobName" http://www.someurl.com/file.ext "%cd%\name.ext"
Upvotes: 2