Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在不使用任何外部工具的情况下下载带有批处理文件的文件?_.net_Jscript_Wsh_Batch File - Fatal编程技术网

.net 如何在不使用任何外部工具的情况下下载带有批处理文件的文件?

.net 如何在不使用任何外部工具的情况下下载带有批处理文件的文件?,.net,jscript,wsh,batch-file,.net,Jscript,Wsh,Batch File,首先澄清这个问题是针对HTTP(s)下载的。对于FTP可能是,我会问(并回答)另一个问题。 这里有——但我想说得更准确些 除了排除外部工具之外,我希望解决方案适用于尽可能广泛的windows机器类型(包括XP、Win2003、Vista,它们仍然有足够大的份额)。 另外,由于WSH是一个可能的选项,我不希望使用临时文件,所有内容都打包在一个.bat文件中(jscript和vbscript都可以) 可能的方法是什么 带有命令行实用程序的“纯”批处理解决方案 在每台windows计算机上都可以使用。

首先澄清这个问题是针对HTTP(s)下载的。对于FTP可能是,我会问(并回答)另一个问题。 这里有——但我想说得更准确些

除了排除外部工具之外,我希望解决方案适用于尽可能广泛的windows机器类型(包括XP、Win2003、Vista,它们仍然有足够大的份额)。 另外,由于
WSH
是一个可能的选项,我不希望使用临时文件,所有内容都打包在一个
.bat
文件中(jscript和vbscript都可以)

可能的方法是什么

  • 带有命令行实用程序的“纯”批处理解决方案 在每台windows计算机上都可以使用。这不是很方便,但是 不应使用其他脚本语言
  • 使用WSH-可能有三种方法-, ,-所有这些都可以通过ActiveX访问 对象,按我喜欢的顺序排列。WinHTTP和MSXML2.XMLHTTP 它们的功能非常相似,但WinHTTP有一个 更稳定的.InternetExlorer.Application的声誉实际上是 仅可通过ActiveX对象访问Internet explorer和 一些UI元素是不可避免的(是吗?),所以我将跳过这一个
  • 使用.NET-可以创建一个包含所有 三个默认的.NET编译器(Jscript.NET、VB.NET、C#)具有 Jscript.net没有多余的错误消息,所以我更喜欢它 如果我们忽略一个事实,那就是有一个已编译的.exe,那么所有的代码 在一个文件中,因此根据我的说法,这符合要求:-) .使用.NET,我们可以使用System.NET.WebClient或 System.Net.HttpWebRequest(网络客户端依赖于它)或
    System.Web.HttpRequest,但现在我只发布 System.Net.WebClient解决方案。以及更多相同的ActiveX对象 WSH也可以在这里访问。所以有很多 使用.Net加载文件的方法。可能在将来我会更新 我的回答。无论如何,只有Webclient是专门为下载而设计的
  • 使用powershell-具有与.NET相同的可能性,但使用更少 有可能安装在所有你能遇到的机器上。所以我跳过 这个也是

  • 答案。所有脚本应使用
    .bat
    /
    .cmd
    扩展名保存,并可直接用作批处理脚本

  • (由于某些原因,在最新的win10版本中,这被认为是特洛伊木马线程):

    certutil.exe-urlcache-split-f“https://download.sysinternals.com/files/PSTools.zip“pstools.zip

  • 为方便起见,可以使用宏:

    set "download=certutil.exe -urlcache -split -f"
    %download% "https://download.sysinternals.com/files/PSTools.zip" pstools.zip
    
    可以滥用命令从internet下载文件。从Vista开始,默认情况下在windows中可用。对于WinXP Server 2003,需要管理工具

  • 比特最小值
  • 最简单的使用方法

    bitsadmin /transfer myDownloadJob /download /priority normal http://downloadsrv/10mb.zip c:\10mb.zip
    
    使用宏:

    set "dnld=bitsadmin /transfer myDownloadJob /download /priority normal"
    %dnld% "https://download.sysinternals.com/files/PSTools.zip" %cd%\pstools.zip
    
    或与

  • 是一个使用的命令行http客户端。它可以执行整个范围的http(POST、DELETE、…)请求,也可以用于下载文件(不是太大的文件)。还可以添加自定义头
  • 是使用对象下载文件的bat文件。不提供如此丰富的选项,尽管它仍然是一个选项

    调用XMLHTTPDownloadJS.bat“https://download.sysinternals.com/files/PSTools.zip pst2.zip“pstools.zip

  • 使用.NET类。它创建一个小的exe文件以便自编译,并且需要安装一个.net framework。由于该类在.net的早期版本中出现,因此它具有足够的向后兼容性

  • 对于最新版本的Windows10,我们有了这个命令,尽管这不是一个向后兼容的选项。请注意,默认情况下只有最新版本的windows安装了CURL

    卷曲“https://download.sysinternals.com/files/PSTools.zip“--输出pstools.zip

  • Windows上有一个实用程序(与CMD一起驻留),可以从CMD运行(如果您具有写访问权限):

    Powershell中的cmdlet:

    $url = "https://www.nsa.org/content/hl-images/2017/02/09/NSA.jpg"
    $file = "file.jpg"
    $ProgressPreference = "SilentlyContinue";
    Invoke-WebRequest -Uri $url -outfile $file
    
    PowerShell下的.Net:

    $url = "https://www.nsa.org/content/hl-images/2017/02/09/NSA.jpg"
    $file = "file.jpg"
    # Add the necessary .NET assembly
    Add-Type -AssemblyName System.Net.Http
    # Create the HttpClient object
    $client = New-Object -TypeName System.Net.Http.Httpclient
    $task = $client.GetAsync($url)
    $task.wait();
    [io.file]::WriteAllBytes($file, $task.Result.Content.ReadAsByteArrayAsync().Result)
    
    C#使用csc.exe生成命令行:

    内置Windows应用程序。不需要外部下载


    在Win 10上测试

    能否使用
    bitsadmin
    下载网页上的每个文件?@WSH JScript存在多个问题
    WScript
    区分大小写,-saveTo用作未命名的参数,
    XMLHTTPObj
    有时会错卖
    WinHTTPObj
    。我还建议您使用
    WScript.ScriptName
    简化直接的cscript调用。不要忘记powershell命令
    (新对象Net.WebClient)。DownloadFile('Source,Dest')
    。适用于powershell v2,未测试v1。这是唯一一个可以在操作系统上下载文件的脚本,PS&CMD的值太低了。@npocmaka嗨,那么,谁能从文件中只得到最后修改的日期,而不是下载答案/代码?无论如何,对不起,我的。我发现我需要
    /dynamic
    开关。例如:
    bitsadmin/transfer myDownloadJob/dynamic/download/priority前台https://github.com/microsoft/vscode-cpptools/releases/latest/download/cpptools-win32.vsix %USERPROFILE%\Downloads\cpptools-win32.vsix
    谢谢。certutil的问题是新的。现在它被检测为一个线程。
    Certutil
    在病毒滥用它下载exe、pif、vbs和bat文件后,默认情况下,写入权限现在只授予TrustedInstaller。与
    cURL
    BitsAdmin
    相比,
    certutil
    有什么优势?您还可以使用它们下载内容…
    certutil
    用于证书、pfx文件、加密密钥、注册表、根目录、active directory、策略、缓存、数据库、编码文件(以避免被防病毒检测),除了下载文件和证书,因此可能是病毒和恶意软件的流行选择,以避免进一步检测,
    certutil
    还可以在普通文件的备用数据流中隐藏可执行文件,例如
    trustme.txt
    call webclientDownload.bat "https://download.sysinternals.com/files/PSTools.zip" pstools.zip
    
    set url=https://www.nsa.org/content/hl-images/2017/02/09/NSA.jpg
    set file=file.jpg
    certutil -urlcache -split -f %url% %file%
    :also certutil.exe -verifyctl -f -split %url% %file%
    
    $url = "https://www.nsa.org/content/hl-images/2017/02/09/NSA.jpg"
    $file = "file.jpg"
    $ProgressPreference = "SilentlyContinue";
    Invoke-WebRequest -Uri $url -outfile $file
    
    $url = "https://www.nsa.org/content/hl-images/2017/02/09/NSA.jpg"
    $file = "file.jpg"
    # Add the necessary .NET assembly
    Add-Type -AssemblyName System.Net.Http
    # Create the HttpClient object
    $client = New-Object -TypeName System.Net.Http.Httpclient
    $task = $client.GetAsync($url)
    $task.wait();
    [io.file]::WriteAllBytes($file, $task.Result.Content.ReadAsByteArrayAsync().Result)
    
    using System;
    using System.IO;
    
    using System.Net.Http;
    using System.Threading.Tasks;
    
    namespace DownloadImage
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                using var httpClient = new HttpClient();
                var url = "https://www.nsa.org/content/hl-images/2017/02/09/NSA.jpg";
                byte[] imageBytes = await httpClient.GetByteArrayAsync(url);
    
                using var fs = new FileStream("file.jpg", FileMode.Create);
                fs.Write(imageBytes, 0, imageBytes.Length);
    
            }
        }
    }