Windows PowerShell 中 wget 的本机替代品?

jsa*_*nen 330 windows powershell powershell-2.0 powershell-3.0 powershell-4.0

我知道我可以下载并安装上述库(适用于 Windows 的 wget),但我的问题是:

在 Windows PowerShell 中,是否有本机替代wget

我只需要wget使用 HTTP GET 从给定的 URL 检索文件。例如:

wget http://www.google.com/
Run Code Online (Sandbox Code Playgroud)

War*_*mak 290

这是一个简单的 PS 3.0 和更高版本的 one-liner,它可以工作并且不涉及太多 PS barf:

wget http://blog.stackexchange.com/ -OutFile out.html
Run Code Online (Sandbox Code Playgroud)

注意:

  • wget 是别名 Invoke-WebRequest
  • Invoke-WebRequest 返回一个HtmlWebResponseObject,其中包含许多有用的 HTML 解析属性,例如 Links、Images、Forms、InputFields 等,但在这种情况下我们只是使用原始 Content
  • 文件内容在写入磁盘之前存储在内存中,使得这种方法不适合下载大文件
  • 在 Windows Server Core 安装上,您需要将其编写为

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
    Run Code Online (Sandbox Code Playgroud)
  • 在 2014 年 9 月 20 日之前,我建议

    (wget http://blog.stackexchange.com/).Content >out.html
    
    Run Code Online (Sandbox Code Playgroud)

    作为答案。但是,这并不适用于所有情况,因为>运算符(它是 的别名Out-File)将输入转换为 Unicode。

如果您使用的是 Windows 7,则需要安装版本 4 或更高版本的 Windows 管理框架。

您可能会发现使用$ProgressPreference = "silentlyContinue"beforeInvoke-WebRequest会显着提高大文件的下载速度;此变量控制是否呈现进度 UI。

  • 公平警告:此方法会将文件的全部内容放入内存中,然后再将其写出到文件中。这不是下载大文件的好方法。 (22认同)
  • 但是 [Windows 7 仅附带 PowerShell 2.0](http://superuser.com/questions/650814),结果将是“术语 'Invoke-WebRequest' 未被识别为 cmdlet 的名称,... ”。 (13认同)
  • 这是现在的正确答案,我不小心遇到了 wget 测试我是否安装了实际的 wget。烦人的是它无法轻松获取文件名(您必须在输出重定向中指定它),但是此选项具有比真正的 wget 更好的 UI(在我看来),所以就是这样。 (4认同)
  • @im_nullable,不错的称呼——我已将其添加到帖子中。 (2认同)

Tra*_*Guy 193

如果你只需要检索一个文件,你可以使用WebClient对象的DownloadFile方法:

$client = New-Object System.Net.WebClient
$client.DownloadFile($url, $path)
Run Code Online (Sandbox Code Playgroud)

其中$url是表示文件 URL 的字符串,表示$path文件将保存到的本地路径。

注意$path必须包含文件名;它不能只是一个目录。

  • 到目前为止,这是提出的最佳解决方案。还考虑到我似乎可以用一行格式将它重写为 `(new-object System.Net.WebClient).DownloadFile('$url, $path)`,这是迄今为止我见过的最好的 `wget` 对应. 谢谢! (37认同)
  • 是的,这在 Windows 7 上开箱即用([PowerShell 2.0 附带的](http://superuser.com/questions/650814))。示例:`$client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html")` (6认同)
  • 如果只是获取一个 url 并忽略结果(例如,IIS 预热脚本的一部分),请使用 DownloadData:`(new-object System.Net.WebClient).DownloadData($url) | 出空` (4认同)
  • 作为旁注,您还可以使用类似 (new-object System.Net.WebClient).DownloadFileAsync(url,filePath) 之类的方法异步执行此操作 (3认同)

use*_*514 97

Invoke-WebRequest在即将到来的PowerShell版本3:

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
Run Code Online (Sandbox Code Playgroud)

  • `dd` 的所有优雅...... (9认同)
  • 我的意思是,当您可以使用 `>`(覆盖)或 `>>`(追加)到文件时,`-Outfile` 参数似乎无关紧要。 (8认同)
  • @gWaldo 甚至可以像 `wget` 一样从 URL 中推断出文件名:) (5认同)
  • 从 PS 4.0 开始,`wget` 和 `curl` 默认别名为 `Invoke-WebRequest` (`iwr`) :D (5认同)
  • @gWaldo PowerShell 可以非常灵活。您可以使用快捷方式 `(iwr http://www.google.com/).Content > google.html` 或使用参数 `Invoke-WebRequest -Uri "http://www.google.com" -OutFile google.html `。重要的是要认识到,在 PowerShell 中,管道是一个对象管道,而不仅仅是字符管道,因此“Invoke-WebRequest”的输出不是文件流,而是一个需要使用“.Content”的对象`。试试这个: `$foo = Invoke-WebRequest http://www.google.com` 然后 `$foo | Get-Member` 然后是 `$foo.StatusCode` 或 `$foo.Content`。 (2认同)

Mat*_*les 19

这有点乱,但是有这篇博客文章可以为您提供下载文件的说明。

或者(这是我推荐的),您可以使用 BITS:

Import-Module BitsTransfer
Start-BitsTransfer -source "http://urlToDownload"
Run Code Online (Sandbox Code Playgroud)

它将显示进度并将文件下载到当前目录。

  • BITS 依赖于服务器端的支持,如果可用,它可以在后台运行,您可以使用其他 cmdlet 获取进度更新。 (3认同)
  • 我试图获取 http://www.google.com/,但我得到的只是`Start-BitsTransfer:访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))`。我很困惑:| (2认同)

小智 8

如果您的 Windows 足够新(例如版本 1809 或更高版本),则可以使用“真正的”curl。curl 有命令行选项“-O”(大写字母 O;小写字母不会做同样的事情!)选项“-O”,或者“--remote-name”告诉curl,保存的文件获取与 URL 的文件名部分相同的名称。

人们需要将其启动为“curl.exe”,以将其与“Invoke-WebRequest”的别名“curl”区分开来。顺便说一句,它可以在 cmd.exe 中运行,无需更改。

使用与此处另一个答案中相同的示例

curl.exe -O http://demo.mediacore.tv/files/31266.mp4
Run Code Online (Sandbox Code Playgroud)

(该网站不允许我将其添加为评论,因为我显然需要更多的“声誉” - 所以它得到了一个新的答案)


小智 7

PowerShell V4 单线:

(iwr http://blog.stackexchange.com/).Content >index.html`
Run Code Online (Sandbox Code Playgroud)

或者

(iwr http://demo.mediacore.tv/files/31266.mp4).Content >video.mp4
Run Code Online (Sandbox Code Playgroud)

这基本上是Warren 的(很棒)V3 one-liner (谢谢你!) - 只需稍作改动即可使其在 V4 PowerShell 中工作。

Warren 的单线- 只是使用wget而不是iwr- 应该仍然适用于V3(至少,我猜;不过没有测试过)。反正。但是当尝试在V4 PowerShell 中执行它时(正如我所尝试的那样),您会看到 PowerShell 无法解析wget为有效的 cmdlet/程序。

对于那些感兴趣的人,那就是 - 正如我从Bob 的评论对接受的答案的回复 (谢谢,伙计!) - 因为从 PowerShell V4 开始,wget并且curl别名为Invoke-WebRequestiwr默认设置为。因此,wget无法解决(以及curl无法在这里工作)