使用具有专有名称的Powershell从http下载多个文件

时间:2014-04-30 21:38:33

标签: http powershell cmdlet

我已经搜索过类似的东西,并且我一直在运行FTP下载答案。这是有用的信息,但最终证明难以翻译。我找到了一个powershell脚本,它可以工作,但我想知道它是否可以根据我的需要进行调整。我对powershell脚本没有太多经验,但我正在努力学习。

需要这样。我需要无人值守地下载并安装一系列文件到远程机器。这些文件通过tinyurls通过电子邮件分发。我现在将它们放入.txt文件中,然后让PowerShell脚本读取列表并下载每个文件。

项目的要求以及为什么我转向powershell(而不是其他实用程序),这些是非常专业的机器。唯一可用的工具是嵌入Windows 7的工具。

我遇到的困难是: 文件下载一个。我想在Web服务器允许的同时获取尽可能多的下载量。 (通常是6)

当前脚本根据tinyurl创建文件名。我需要来自网络服务器的实际文件名。

提前感谢任何建议。

以下是我目前正在使用的脚本。

#  Copyright (C) 2011 by David Wright (davidwright@digitalwindfire.com)
#  All Rights Reserved.

#  Redistribution and use in source and binary forms, with or without
#  modification or permission, are permitted.

#  Additional information available at http://www.digitalwindfire.com.

$folder = "d:\downloads\"
$userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"
$web = New-Object System.Net.WebClient
$web.Headers.Add("user-agent", $userAgent)


Get-Content "d:\downloads\files.txt" |
    Foreach-Object { 
        "Downloading " + $_
        try {
            $target = join-path $folder ([io.path]::getfilename($_))
            $web.DownloadFile($_, $target)
        } catch {
            $_.Exception.Message
        }
}

1 个答案:

答案 0 :(得分:2)

如果在决定文件名之前执行Web请求,则应该能够获得扩展路径(否则您将需要发出两个Web请求,一个用于获取扩展路径,另一个用于下载文件)。

当我尝试此操作时,我发现BaseResponse cmdlet返回的Microsoft.PowerShell.Commands.HtmlWebResponseObject的{​​{1}}属性具有Invoke-WebRequest属性,这是我们正在寻找的扩展路径对于。

如果您得到正确的响应,只需使用扩展路径中的名称保存文件,如下所示(此示例代码不会查看HTTP响应代码或类似代码,但希望一切顺利):

ResponseUri

考虑到function Save-TinyUrlFile { PARAM ( $TinyUrl, $DestinationFolder ) $response = Invoke-WebRequest -Uri $TinyUrl $filename = [System.IO.Path]::GetFileName($response.BaseResponse.ResponseUri.OriginalString) $filepath = [System.IO.Path]::Combine($DestinationFolder, $filename) try { $filestream = [System.IO.File]::Create($filepath) $response.RawContentStream.WriteTo($filestream) $filestream.Close() } finally { if ($filestream) { $filestream.Dispose(); } } } 文件夹存在,可以使用以下内容调用此方法:

$HOME\Documents\Temp

在我的计算机上,将从github存储库获取的名为Save-TinyUrlFile -TinyUrl http://tinyurl.com/ojt3lgz -DestinationFolder $HOME\Documents\Temp 的文件保存到我的计算机上。

如果您想同时下载多个文件,可以让PowerShell为您实现这一目标。要么使用PowerShell工作流并行功能,要么只为每个网址启用robots.txt。以下是使用PowerShell Job

执行此操作的示例
Jobs