Я пытаюсь загрузить и запустить установщик (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
@mklement0 В моем случае создается файл «boost_1_74_0-msvc-14.2-64.exe», но на самом деле это текстовый файл с именем «boost_1_74_0-msvc-14.2-64.exe».
Фактический URL-адрес, по которому загружается файл: Pilotfiber.dl.sourceforge.net/project/boost/boost-binaries/…, поэтому ваш код должен быть 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'
Кажется, Invoke-WeRequest
должен следовать за перенаправлением, если это так.
@mklement0, я использую эту ссылку, потому что это то, что мне удалось откатить от шоколадной установки Boost. Я пытаюсь загрузить и установить только 64-битную версию, stackoverflow.com/questions/78624872/…
Ссылка «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-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe
, который жестко запрограммирован в пакете Choco?
Шоколадные отчеты с использованием Get-Webfile -url 'https://downloads.sourceforge.net/project/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe' -fileName 'boost_1_74_0-msvc-14.2-64.exe'
(с исходной ссылкой), но Get-Webfile
мне недоступны, я получаю сообщение «Термин Get-Webfile не распознается как имя командлета».
Чтобы добавить в Чей-то полезный ответ:
Несмотря на свой внешний вид, URL https://downloads.sourceforge.net/project/boost/boost-binaries/1.74.0/boost_1_74_0-msvc-14.2-64.exe
не нацелен напрямую на загружаемый файл.
Когда вы открываете этот URL-адрес в интерактивном режиме в веб-браузере:
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
curl
, для которого требуется -L
— по умолчанию следуют HTTP-перенаправлениям до 5
раз. Чтобы изменить это число, используйте параметр -MaximumRedirection
.
Я попробовал запустить
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'
, и в моем случае загруженный exe-файл представляет собой простой текстовый файл в формате HTML. сравните размер файла с файлом, загруженным вручную.