【问题标题】:Reading the file name of downloaded file using PowerShell使用 PowerShell 读取下载文件的文件名
【发布时间】:2016-07-15 11:47:03
【问题描述】:

我有一个文件,其中包含多个指向此类文件的 URL:

http://ligman.me/1HCDxl9
http://ligman.me/1HCCCRP
http://ligman.me/1HCCCRP
http://ligman.me/1H4Q0e5
http://ligman.me/1H4Q0e5
http://ligman.me/1JI6V77
http://ligman.me/1JI6V77
http://ligman.me/1CSMobd
http://ligman.me/1CSMobd

我想写一个 PowerShell 脚本,它会逐行读取这个文件,然后下载每一行后面的文件(URL)。到目前为止,我已经设法使用以下脚本下载了文件:

$reader = [System.IO.File]::ReadLines("C:\Temp\Ebooks\ebooks.txt") | Where-Object { $_ -ne '' }
$targetDir = "C:\Temp\Ebooks\"
$wc = New-Object System.Net.WebClient

foreach($file in $reader) {    
    $sourceFileName = $file.SubString($file.LastIndexOf('/')+1) + ".pdf" 
    $targetFileName = $targetDir + $sourceFileName
    $wc.DownloadFile($file, $targetFileName)
    Write-Host "Downloaded $file successfully to directory $targetDir"
}

我的问题是文件名。现在,我只能将它们保存为 PDF,但有时,这些文件不是 PDF 文件,而是 DOCX 或 XLSX。此外,如果它们不命名为 1225DID 或 13DChwr,那就太好了。基本上,我仍然需要读取实际文件名,然后使用该名称保存下载的文件。

我该怎么做?

编辑:这适用于获取实际文件名,但是当我尝试打开文件时,我收到一个错误,即它们不是 PDF 或已损坏(前提是我尝试使用 Foxit Reader 打开 PDF 文件)

$reader = [System.IO.File]::ReadLines("C:\Temp\Ebooks\ebooks.txt") | Where-Object { $_ -ne '' }
$targetDir = "C:\Temp\Ebooks\"
$wc = New-Object System.Net.WebClient

$reader | %{    
    $uri = $_
    $request = Invoke-WebRequest -Uri $uri -MaximumRedirection 0 -ErrorAction Ignore   

    $sourceFileName = $request.Headers.Location.SubString($request.Headers.Location.LastIndexOf('/') + 1) 
    $targetFileName = $targetDir + $sourceFileName
    $wc.DownloadFile($file, $targetFileName)
    Write-Host "Downloaded $file successfully to directory $targetDir"
}

【问题讨论】:

  • 您能否分享您尝试定位的实际 URL 之一或具有相同格式的内容的示例?
  • 好的,我编辑了 URL,它们现在应该是有效的
  • 我已经尝试阅读这些文件的内容配置,但似乎它们只有“附件”作为值,没有别的。
  • 您是否尝试过使用Invoke-WebRequest 来显示目录的内容? (见stackoverflow.com/questions/27944884/…
  • 我更新了我的问题

标签: powershell


【解决方案1】:

使用fiddler,好像在后台有重定向。

如果您执行以下脚本,您将获得您提供的网址后面的“真实”网址。

$links = @(
    "http://ligman.me/1HCDxl9",
    "http://ligman.me/1HCCCRP",
    "http://ligman.me/1H4Q0e5",
    "http://ligman.me/1JI6V77",
    "http://ligman.me/1CSMobd"
)

$links | %{
    $uri = $_

    $request = Invoke-WebRequest -Uri $uri -MaximumRedirection 0 -ErrorAction Ignore
    Write-Host $request.Headers.Location
}

此脚本生成以下列表,其中包含文档名称及其扩展名。

http://download.microsoft.com/download/4/2/f/42f9b256-977e-4792-a9eb-d490516d4468/AF103733558_en-us_access2013quickstartguide.pdf
http://download.microsoft.com/download/6/7/5/675609de-a32b-44d4-ace6-86305afb808f/AF103733448_en-us_word2013quickstartguide.pdf
http://download.microsoft.com/download/2/8/7/28747b20-70b0-4003-b82a-5ab0d222bbd6/AF103733495_en-us_publisher2013quickstartguide.pdf
http://download.microsoft.com/download/e/6/f/e6fc74dc-9f0d-4e6c-bbcc-6855e4d7a78c/AF103733479_en-us_project2013quickstartguide.pdf
http://download.microsoft.com/download/c/e/b/ceb742d6-bc1f-4447-ad06-b0842338dd8c/AF103733547_en-us_onenote2013quickstartguide.pdf

这是一个适合我的下载文件版本:

$links | %{
    $uri = $_

    $request = Invoke-WebRequest -Uri $uri -MaximumRedirection 0 -ErrorAction Ignore
    $location = $request.Headers.Location
    $output = "D:\temp\" + $location.SubString($location.LastIndexOf('/') + 1)

    Invoke-WebRequest -Uri $location -OutFile $output
}

【讨论】:

  • 这是完美的,我现在有了实际的文件名。但是,在打开文件时出现错误,例如文件已损坏的 PDF 文件。我尝试打开哪一个并不重要,它总是一样的。请参阅我的问题以获取更新的代码。
  • 编辑答案以提供下载示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
相关资源
最近更新 更多