2014-09-08 3 views
2

Я хотел бы загрузить файл из .bat-скрипта в Windows 7 и поместить его в текущую папку (где есть скрипт).windows batch: загрузить файл в текущую папку

Я пытался таким образом, без (хороших) результатов:

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

Я получил это:

Unable to add file - 0x80070005 

Почему? Я полагаю, что строка CONCAT терпит неудачу

(я знаю, что bitsadmin осуждается в Win7)

Спасибо заранее!

+0

Какую именно папку вы пытаетесь написать? Возможно, что BITS работает как ограниченный пользователь, которому запрещено писать в эту папку. –

+0

Пользователь @AndrewMedico разрешен для записи. Это была проблема синтаксиса. Спасибо – dar0x

ответ

4

Ваша проблема заключалась в пробелах по обе стороны от знака равенства. Они включаются как в имя переменной, так и в содержимое переменной - плюс отсутствие обратной косой черты, которую вы нашли.

Испытание это:

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

EDIT: В случае, если вы выполняете это как администратор, попробуйте отредактированный код, указанный выше.
потому что при работе с повышенными разрешениями рабочий каталог меняется.

Просьба сообщать обо всех сообщениях об ошибках, когда вы говорите, что что-то не работает, поэтому проблема может быть решена.

+0

Кажется, что он не работает должным образом. Я попробовал SET "FILENAME = name.ext" и SET FILENAME = "name.ext" – dar0x

+0

См. Мое редактирование выше. – foxidrive

1

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

Я думаю Bitsadmin не работает с относительными путями, и вам нужно добавить полное имя локального файла.

Вы также можете проверить мой скрипт bitadmin, который тратит много грязной работы - он принимает два аргумента url и путь к локальному файлу (и номер таймаута - по умолчанию - 5). Как вы можете видеть, ПЭНД %CD% с именем локальной файловой:

@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 

Вы можете также проверить эту JScript.NET само скомпилирован гибрид (сохранить его как .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); 
} 
+0

Вам не нужно разбирать всю сводку с переключателя/info./GetState переключает состояние заданного задания –

1

Я решил самостоятельно, без использования FILENAME переменная:

bitsadmin.exe /transfer "JobName" http://www.someurl.com/file.ext "%cd%\name.ext" 
2

PowerShell

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

из CMD окр

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

reference

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

Это один работает.Просто измените линию

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

в

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

Просто измените SET «FILENAME =% ~ dp0 \ name.ext» на SET «FILENAME =% ~ dp0 \ Ваше имя файла» –

+0

Как это отличается от принятого ответа? – DSway

0

Просто используйте Powershell это обыкновение быть проблемой.

@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 

Это может занять до 20 секунд, более или менее в зависимости от размера файла.

Смежные вопросы