3

我已经搜索过类似的东西,并且一直在浏览 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
        }
}
4

1 回答 1

2

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

当我尝试这个时,我发现cmdlet返回的BaseResponse属性有一个属性,它是我们正在寻找的扩展路径。Microsoft.PowerShell.Commands.HtmlWebResponseObjectInvoke-WebRequestResponseUri

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

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假设文件夹存在,则可以使用类似以下内容调用此方法:

Save-TinyUrlFile -TinyUrl http://tinyurl.com/ojt3lgz -DestinationFolder $HOME\Documents\Temp

在我的计算机上,它将一个名为 的文件保存到我的计算机上,该文件robots.txt取自 github 存储库。

如果您想同时下载多个文件,您可以让 PowerShell 为您实现这一点。要么使用 PowerShell 工作流并行功能,要么简单地Job为每个 url 启动一个。这是一个关于如何使用 PowerShell 进行操作的示例Jobs

Get-Content files.txt | Foreach {
    Start-Job {
        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();
                }
            }
        }

        Save-TinyUrlFile -TinyUrl $args[0] -DestinationFolder $args[1]
    } -ArgumentList $_, "$HOME\documents\temp"
}
于 2014-05-01T00:24:43.313 回答