Как загрузить и запустить установщик с помощью PowerShell?

Я пытаюсь загрузить и запустить установщик (Boost 1.74) в Windows PowerShell для системы CI:

Я использую Invoke-WebRequest и после этого просто запускаю программу. Однако он говорит мне, что файл поврежден. Я пробовал несколько раз и не думаю, что файл поврежден, но, возможно, проблема с разрешениями.

$ Invoke-WebRequest 'https://downloads.sourceforge.net/project/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe' -OutFile 'boost_1_74_0-msvc-14.2-64.exe'
$ ./boost_1_74_0-msvc-14.2-64.exe
Program 'boost_1_74_0-msvc-14.2-64.exe' failed to run: The file or directory is corrupted and unreadableAt line:323 
char:1
+ ./boost_1_74_0-msvc-14.2-64.exe
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.
At line:323 char:1
+ ./boost_1_74_0-msvc-14.2-64.exe
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (:) [], ApplicationFailedException
    + FullyQualifiedErrorId : NativeCommandFailed

Как я могу убедиться, что установщик выполняется здесь? Что я делаю не так?


ПРИМЕЧАНИЕ. Я использую эту ссылку (которая, согласно комментариям, просто указывает на небольшой текстовый файл с другим веб-адресом), потому что именно она используется установщиком Chocolatey.

# Install 64 bit binaries
Install-ChocolateyPackage `
    -packageName 'boost-msvc-14.2' `
    -installerType 'exe' `
    -silentArgs '/VERYSILENT' `
    -url64bit 'https://downloads.sourceforge.net/project/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe' `
    -checksum64 74229a45b1e13f05c5bbdca7a268ac7723d97c33bec209e5f669b6cb3ffaeab6 `
    -checksumType64 sha256

Я попробовал запустить Invoke-WebRequest 'https://downloads.sourceforge.net/project/boost/boost-binar‌​ies/1.74.0/boost_1_7‌​4_0-msvc-14.2-64.exe‌​' -OutFile 'boost_1_74_0-msvc-14.2-64.exe', и в моем случае загруженный exe-файл представляет собой простой текстовый файл в формате HTML. сравните размер файла с файлом, загруженным вручную.

Someone 17.06.2024 12:56

@mklement0 В моем случае создается файл «boost_1_74_0-msvc-14.2-64.exe», но на самом деле это текстовый файл с именем «boost_1_74_0-msvc-14.2-64.exe».

Someone 17.06.2024 13:34

Фактический URL-адрес, по которому загружается файл: Pilotfiber.dl.sourceforge.net/project/boost/boost-binaries/…‌​, поэтому ваш код должен быть Invoke-WebRequest 'https://pilotfiber.dl.sourceforge.net/project/boost/boost-b‌​inaries/1.74.0/boost‌​_1_74_0-msvc-14.2-64‌​.exe?viasf=1' -OutFile 'boost_1_74_0-msvc-14.2-64.exe'

Someone 17.06.2024 17:01

Кажется, Invoke-WeRequest должен следовать за перенаправлением, если это так.

alfC 17.06.2024 19:34

@mklement0, я использую эту ссылку, потому что это то, что мне удалось откатить от шоколадной установки Boost. Я пытаюсь загрузить и установить только 64-битную версию, stackoverflow.com/questions/78624872/…

alfC 17.06.2024 19:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ссылка «https://downloads.sourceforge.net/project/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe» перенаправляет на «https://pilotfiber.dl.sourceforge.net/». проект/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe?viasf=1'. Чтобы выяснить это, я использовал инструмент записи дорожного движения. поэтому вам нужно исправить URL-адрес в вашем скрипте следующим образом:

Invoke-WebRequest 'https://pilotfiber.dl.sourceforge.net/project/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe?viasf=1' -OutFile 'boost_1_74_0-msvc-14.2-64.exe'

Как это получается из https://downloads.sourceforge.net/project/boost/boost-binari‌​es/1.74.0/boost_1_74‌​_0-msvc-14.2-64.exe, который жестко запрограммирован в пакете Choco?

alfC 17.06.2024 20:54

Шоколадные отчеты с использованием Get-Webfile -url 'https://downloads.sourceforge.net/project/boost/boost-binar‌​ies/1.74.0/boost_1_7‌​4_0-msvc-14.2-64.exe‌​' -fileName 'boost_1_74_0-msvc-14.2-64.exe' (с исходной ссылкой), но Get-Webfile мне недоступны, я получаю сообщение «Термин Get-Webfile не распознается как имя командлета».

alfC 17.06.2024 22:55
Ответ принят как подходящий

Чтобы добавить в Чей-то полезный ответ:

  • Несмотря на свой внешний вид, URL https://downloads.sourceforge.net/project/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe не нацелен напрямую на загружаемый файл.

  • Когда вы открываете этот URL-адрес в интерактивном режиме в веб-браузере:

    • Откроется HTML-страница со встроенным кодом JavaScript, и только при выполнении последнего инициируется загрузка файла (путем отображения диалогового окна загрузки файла (Сохранить как)) – механизм, не связанный с HTTP-перенаправлениями (302).
  • Когда вы используете curl для таргетинга на URL-адрес:

    • Происходит перенаправление HTTP 302 и перенаправляется на настоящий URL-адрес загрузки файла.

    • Поэтому альтернативным решением является использование следующего (на Unix-подобных платформах используйте curl вместо curl.exe):

      curl.exe -L https://downloads.sourceforge.net/project/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe -o boost_1_74_0-msvc-14.2-64.exe
      
  • Целевой веб-сервер решает, какой из двух вариантов поведения применить, на основе строки пользовательского агента, предоставленной клиентом.

    • Строка пользовательского агента, предоставляемая веб-командлетами PowerShell, Invoke-WebRequest и Invoke-RestMethod по умолчанию (к сожалению) запускает поведение браузера; эта строка пользовательского агента выглядит примерно так:

      • В Windows PowerShell:

        Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.22621.3672
        
      • В PowerShell (Core) 7 в Windows:

        Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.22621; en-US) PowerShell/7.4.2
        
    • Поведение, подобное браузерному, является проблематичным, поскольку веб-командлеты PowerShell по своей конструкции поддерживают загрузку только статического контента, а это означает, что выбор указанного URL-адреса приводит к загрузке необработанного исходного кода HTML без выполнения встроенного JavaScript.

    • Таким образом, в указанный -OutFile сохраняется необработанный HTML-код, который, очевидно, не является правильным .exe файлом и при вызове вызывает ошибку, которую вы видели.

  • Из вышеизложенного следует, что вы можете заставить веб-командлеты PowerShell работать должным образом, используя параметр -UserAgent для указания строки пользовательского агента, подобной curl, которая запускает поведение HTTP-перенаправления:

    Invoke-WebRequest -UserAgent curl https://downloads.sourceforge.net/project/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe -OutFile boost_1_74_0-msvc-14.2-64.exe
    
    • Обратите внимание, что веб-командлеты PowerShell — в отличие от curl, для которого требуется -L — по умолчанию следуют HTTP-перенаправлениям до 5 раз. Чтобы изменить это число, используйте параметр -MaximumRedirection.

Другие вопросы по теме