gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:18:11 25 4
gpt4 key购买 nike

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

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

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

我遇到的困难是:这些文件一次下载一个。我想同时获取网络服务器允许的尽可能多的下载。 (通常为 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
}
}

最佳答案

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

当我尝试这样做时,我发现 Invoke-WebRequest 返回的 Microsoft.PowerShell.Commands.HtmlWebResponseObjectBaseResponse 属性cmdlet 有一个 ResponseUri 属性,这是我们正在寻找的扩展路径。

如果您得到正确的响应,只需使用扩展路径中的名称保存文件,如下所示(此示例代码不查看 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 工作流并行功能,要么简单地为每个 url 启动一个 Job。以下是有关如何使用 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"
}

关于http - 使用具有适当名称的 Powershell 从 http 下载多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23398479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com