Windowsバッチファイルを使用して、Webサイト(例: http://www.example.com/package.Zip )からファイルをダウンロードしようとしています。以下の関数を書くとエラーコードが出ます。
xcopy /E /Y "http://www.example.com/package.Zip"
バッチファイルはhttpの後の "/"のようには見えません。それらが関数パラメータであると仮定しないようにそれらの文字をエスケープする方法はありますか?
PowerShell 2.0(Windows 7がプリインストールされている)では、次のものを使用できます。
(New-Object Net.WebClient).DownloadFile('http://www.example.com/package.Zip', 'package.Zip')
PowerShell 3.0(Windows 8プレインストール)以降では、 Invoke-WebRequest
を使用できます。
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"
(PowerShell 2.0はXP、Windows 7では3.0にインストールできます)
あなたがやろうとしていることを達成できる標準のWindowsコンポーネントがあります。 BITS 。 XPおよび2000 SP3以降、Windowsに含まれています。
実行します。
bitsadmin.exe /transfer "JobName" http://download.url/here.exe C:\destination\here.exe
ジョブ名は単にダウンロードジョブの表示名です - あなたがしていることを説明する何かにそれを設定してください。
ちょっとした話題かもしれませんが、Powershellを使ってファイルを簡単にダウンロードできます。 Powershellには最新バージョンのWindowsが付属しているので、コンピューターに余分なものをインストールする必要はありません。私はこのページを読むことによってそれをする方法を学びました:
http://teusje.wordpress.com/2011/02/19/download-file-with-powershell/
コードは次のとおりです。
$webclient = New-Object System.Net.WebClient
$url = "http://www.example.com/file.txt"
$file = "$pwd\file.txt"
$webclient.DownloadFile($url,$file)
最後に確認しましたが、MSコマンドラインからURLに接続するためのコマンドラインコマンドはありません。 Windows用にwgetを試してください。
http://gnuwin32.sourceforge.net/packages/wget.htm
またはURL2File:
http://www.chami.com/free/url2file_wincon.html
Linuxでは、 "wget"を使用できます。
あるいは、VBScriptを試すこともできます。これらはコマンドラインプログラムに似ていますが、wscript.exeスクリプトホストによって解釈されるスクリプトです。これはVBSを使用してファイルをダウンロードする例です:
https://serverfault.com/questions/29707/download-file-from-vbscript
PURE BATCHでファイルをダウンロードしています...
一部の人々は、JScriptやVBScriptなどを使用せずにバッチスクリプトでファイルをダウンロードすることはできないと言っています。しかし、間違いは間違いです。
バッチスクリプトでファイルをダウンロードするのに非常によく機能するように思われる簡単な方法を次に示します。ほとんどすべてのファイルのURLで動作するはずです。必要に応じてプロキシサーバーを使用することもできます。
ファイルをダウンロードするには、WindowsシステムからBITSADMIN.EXEを使用できます。何かをダウンロード/インストールしたり、JScriptやVBScriptなどを使用したりする必要はありません。Bitsadmin.exeは、ほとんどのWindowsバージョン、おそらくXPからWindows 10に存在します。
楽しい!
使用法:
次のように、BITSADMINコマンドを直接使用できます。bitsadmin /transfer mydownloadjob /download /priority normal "http://example.com/File.Zip" "C:\Downloads\File.Zip"
プロキシサーバー:
プロキシを使用して接続するには、ダウンロードする前にこのコマンドを使用します。bitsadmin /setproxysettings mydownloadjob OVERRIDE "proxy-server.com:8080" "<local>"
BITSadmin.exeに関する詳細情報が必要な場合は、これをクリックしてください LINK
カスタム関数:DOWNLOAD_FILE "URL"
:DOWNLOAD_PROXY_ON "SERVER:PORT"
:DOWNLOAD_PROXY_OFF
Bitsadminコマンドを簡素化するために、これら3つの関数を作成しました。使いやすく覚えやすいです。スクリプトで複数回使用している場合に特に便利です。
ご注意ください...
これらの関数を使用する前に、まずCUSTOM_FUNCTIONS.CMDからスクリプトの最後にそれらをコピーする必要があります。完全な例もあります:DOWNLOAD-EXAMPLE.CMD
:DOWNLOAD_FILE "URL"
主な機能は、URLからファイルをダウンロードします。
:DOWNLOAD_PROXY_ON "SERVER:PORT"
(オプション)プロキシサーバーを使用する必要がある場合、この機能を使用できます。
:DOWNLOAD_PROXY_OFF関数を呼び出すと、無効になります。
例:CALL :DOWNLOAD_PROXY_ON "proxy-server.com:8080"
CALL :DOWNLOAD_FILE "http://example.com/File.Zip" "C:\Downloads\File.Zip"
CALL :DOWNLOAD_PROXY_OFF
CUSTOM_FUNCTIONS.CMD
:DOWNLOAD_FILE
rem BITSADMIN COMMAND FOR DOWNLOADING FILES:
bitsadmin /transfer mydownloadjob /download /priority normal %1 %2
GOTO :EOF
:DOWNLOAD_PROXY_ON
rem FUNCTION FOR USING A PROXY SERVER:
bitsadmin /setproxysettings mydownloadjob OVERRIDE %1 "<local>"
GOTO :EOF
:DOWNLOAD_PROXY_OFF
rem FUNCTION FOR STOP USING A PROXY SERVER:
bitsadmin /setproxysettings mydownloadjob NO_PROXY
GOTO :EOF
DOWNLOAD-EXAMPLE.CMD
@ECHO OFF
SETLOCAL
rem FOR DOWNLOADING, 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 DOWNLOADING A PICTURE (URL):
SET "FILE_URL=https://upload.wikimedia.org/wikipedia/en/8/86/Einstein_tongue.jpg"
rem SAVING FILE TO THE SCRIPT FOLDER:
SET "SAVING_TO=Einstein_tongue.jpg"
SET "SAVING_TO=%~dp0%SAVING_TO%"
rem OR, UNCOMMENT NEXT LINE FOR SAVING TO ANY OTHER PATH:
rem SET "SAVING_TO=C:\Folder\Einstein_tongue.jpg"
:MAIN
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 HERE IS THE MAIN DOWNLOADING COMMAND:
CALL :DOWNLOAD_FILE "%FILE_URL%" "%SAVING_TO%"
rem UNCOMMENT NEXT LINE FOR DISABLING ANY PROXY:
rem CALL :DOWNLOAD_PROXY_OFF
ECHO.
rem THIS IS THE END...
PAUSE
EXIT /B
rem FUNCTIONS SECTION
:DOWNLOAD_FILE
rem BITSADMIN COMMAND FOR DOWNLOADING FILES:
bitsadmin /transfer mydownloadjob /download /priority normal %1 %2
GOTO :EOF
:DOWNLOAD_PROXY_ON
rem FUNCTION FOR USING A PROXY SERVER:
bitsadmin /setproxysettings mydownloadjob OVERRIDE %1 "<local>"
GOTO :EOF
:DOWNLOAD_PROXY_OFF
rem FUNCTION FOR STOP USING A PROXY SERVER:
bitsadmin /setproxysettings mydownloadjob NO_PROXY
GOTO :EOF
' 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
それから
C:\>cscript geturl.vbs
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.
200 A OK http://www.google.com
またはダブルクリックしてウィンドウでテストする
ご存知のとおり、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
さらなる説明 ここ
ここからWgetをダウンロードする http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe
それをインストールしてください。
それからいくつかの.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とファイルパスを調整する
Httpを介してxcopyを使用することはできません。 Windows用のwgetをダウンロードしてみてください。それはトリックをするかもしれません。それはhttpを通してファイルの非対話型のダウンロードのためのコマンドラインユーティリティです。あなたはそれを得ることができます http://gnuwin32.sourceforge.net/packages/wget.htm
Bitsadminがお茶以外の場合は、次のPowerShellコマンドを使用できます。
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
そしてそれをexeに変換します。
Wgetの代わりにaria2を使って特定のURLからファイルをダウンロードすることもできます。
Aria2の詳細については、次のリンクを参照してください。
これは私がゲームサーバープロジェクトのために次のことをしたように働くべきです。 Zipをダウンロードして、指定したディレクトリに展開します。
name.batまたはname.cmdとして保存
@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
オリジナル: https://github.com/C0nw0nk/SteamCMD-AutoUpdate-Any-Gameserver/blob/master/Steam.cmd
BATCHではこれができない場合がありますが、Windowsにデフォルトでインストールされていないツールを使用したくない場合は、JScriptまたはVBScriptを使用できます。
このページの最初の例では、VBScriptのバイナリファイルをダウンロードしています。 http://www.robvanderwoude.com/vbstech_internet_download.php
このSO answerはJScript(IMO、より良い言語)を使ってファイルをダウンロードします: Windows Script Host(jscript):どうやったらバイナリファイルをダウンロードできますか?
バッチスクリプトはファイルをダウンロードするJScriptまたはVBScriptを呼び出すことができます。
この質問は ここ で非常に良い答えを得ています。私のコードは、いくつかの修正を加えた純粋な答えに基づいています。
スニペットの下にwget.batという名前で保存し、システムパスに入れます(たとえば、ディレクトリに入れてこのディレクトリをシステムパスに追加します)。
次のようにあなたのcliでそれを使うことができます:
wget url/to/file [?custom_name]
url_to_file
は必須、custom_name
はオプションです。
ファイルのURLと保存されたファイル名はANSI色のテキストで表示されます。それが問題を引き起こしているのなら、 this github projectをチェックしてください。
@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
P.S。このコードでは、PowerShellをインストールしておく必要があります。
あなたはwgetを使ってスケジュールされたタスクを設定することができます。
C:\wget\wget.exe -q -O nul "http://www.google.com/shedule.me"
私はこのVBスクリプトを見つけました:
魅力のように働きます。非常に単純な関数呼び出しで関数として構成されています。
SaveWebBinary "http://server/file1.ext1", "C:/file2.ext2"
もともとから: http://www.ericphelps.com/scripting/samples/BinaryDownload/index.htm
これが冗長性の完全なコードです。
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