Эквивалент Powershell для переключателей wget «-nc» и «-i» [дубликаты]

1

На этот вопрос уже есть ответ здесь:

Что такое Powershell-эквивалент этой команды wget?

wget -nc -i downloadList.txt

куда

-i downloadList.txt
загружает список URL-адресов в указанном файле.

-nc
пропускает уже загруженные файлы.

Renuka
источник
@DavidPostill Нет. Я отредактировал вопрос, чтобы сделать его более понятным.
Renuka
Это не точный дубликат, но это отправная точка. Там ничто не мешает вам изменить его в соответствии с вашими потребностями. намек Invoke-WebRequest -InFile<String> будет делать бит «я».
DavidPostill
1
Я сделал свой Google, прежде чем отправлять этот вопрос. Не могу найти способ получения параметров -nc и -i для PS
Renuka
Попробуй погуглить. Invoke-WebRequest Invoke-WebRequest команда PS для получения содержимого с веб-страницы в Интернете. ...
DavidPostill
Все еще не мог получить это. Также попытался извлечь URL, перебирая текстовый файл построчно. Это было медленно, как в аду (на большом файле).
Renuka

Ответы:

1

Вы можете использовать не только командлеты PowerShell, но и классы .Net.

Для части -nc получить содержимое файла и выбрать только уникальные строки с cat (псевдоним для Get-Content ) а также sort (псевдоним для Sort-Object ). Тогда используйте wget (псевдоним для Invoke-WebRequest ) в этом списке строк, извлекая имя выходного файла из URL с GetFileName

cat downloadList.txt | foreach {wget $_ -OutFile ([System.IO.Path]::GetFileName($_))}
Mikhail Tumashenko
источник
1

Нет переключателя Powershell, который ведет себя так же, как -nc

Это не только предотвращает перезапись файла. Он также проверяет, существует ли целевой файл, и не запускает вторую загрузку. Весь смысл -nc чтобы предотвратить фактическую загрузку.

-nc

--no-колошматить

Если файл загружается более одного раза в один и тот же каталог, поведение Wget зависит от нескольких параметров, включая -nc. В некоторых случаях локальный файл будет засорен или перезаписан при повторной загрузке. В остальных случаях это будет сохранено.

При запуске Wget без -N, -nc или -r загрузка одного и того же файла в тот же каталог приведет к сохранению исходной копии файла, а вторая копия будет иметь имя file.1. Если этот файл будет загружен еще раз, третья копия будет называться file.2 и так далее. Если указан параметр -nc, это поведение подавляется, и Wget откажется загружать более новые копии файла. Таким образом, «no-clobber» на самом деле является неправильным в этом режиме. Предотвращается не клоббер (так как числовые суффиксы уже предотвращали клобберинг), а предотвращение сохранения нескольких версий.

При запуске Wget с -r, но без -N или -nc повторная загрузка файла приведет к тому, что новая копия будет просто перезаписывать старую. Добавление -nc предотвратит это поведение, вместо этого будет сохранена исходная версия и проигнорированы все более новые копии на сервере.

При запуске Wget с параметром -N, с параметром -r или без него решение о том, загружать или нет более новую копию файла, зависит от локальной и удаленной отметки времени и размера файла. -nc не может быть указан одновременно с -N.

Обратите внимание, что при указании -nc файлы с суффиксами .html или (yuck) .htm будут загружаться с локального диска и анализироваться так, как если бы они были получены из Интернета.

Итак, в Powershell V3 вы должны имитировать это поведение. В двух словах:

  • Получить все базовые имена (без расширения) файлов в заданной папке (место назначения загрузки)
  • Получить все URL данного текстового файла (downloadList.txt)
  • Сравните оба списка и получить недостающие URL
  • Отправлять только пропущенные URL на Invoke-Webrequest и добавить html как расширение
$folder = "D:\my\folder"
Compare $(Dir $folder).BaseName (gc "D:\downloadList.txt")  -PassThru | 
    where {$_.SideIndicator -eq '=>'} | 
    foreach { wget $_ -OutFile "$folder\$_.html" }

И не гольф

$folder = "D:\my\folder"
$exists = $(Get-ChildItem $folder).BaseName
$urls = Get-Content "D:\downloadList.txt" 
$missing = Compare $exists $urls  -PassThru | where {$_.SideIndicator -eq '=>'}
$missing  | foreach { Invoke-WebRequest -Uri $_ -OutFile "$folder\$_.html" }
nixda
источник