Не удается выполнить двоичный файл, загруженный с HTTP-сервера с помощью PowerShell, с сообщением «Файл или каталог повреждены и не читаются» - PullRequest
0 голосов
/ 15 мая 2018

Я новичок в PowerShell и не имею большого опыта программирования, просто пытаюсь использовать приведенный ниже сценарий Power Shell для установки нескольких программ.Сценарий выдает ошибку при выполнении программного обеспечения WinSCP.

Сообщение об ошибке

Program 'WinSCP-5.13.1-Setup.exe' failed to run: The file or directory is corrupted and unreadableAt line:1 char:1
+ D:\softwares\WinSCP-5.13.1-Setup.exe /
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.
At line:1 char:1
+ D:\softwares\WinSCP-5.13.1-Setup.exe /SP
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (:) [], ApplicationFailedException
    + FullyQualifiedErrorId : NativeCommandFailed

Сценарий:

$source = 'D:\softwares' 

If (!(Test-Path -Path $source -PathType Container)) {New-Item -Path $source -ItemType Directory | Out-Null} 

$packages = @( 
@{title='7zip Extractor';url='http://downloads.sourceforge.net/sevenzip/7z920-x64.msi';Arguments=' /qn';Destination=$source}, 
@{title='Notepad++ 7.5.6';url='https://notepad-plus-plus.org/repository/7.x/7.5.6/npp.7.5.6.Installer.exe';Arguments=' /Q /S';Destination=$source} 
@{title='WinScp 5.13.1';url='https://winscp.net/download/WinSCP-5.13.1-Setup.exe';Arguments=' /';Destination=$source} 
) 

foreach ($package in $packages) { 
    $packageName = $package.title 
    $fileName = Split-Path $package.url -Leaf 
    $destinationPath = Join-Path $package.Destination $fileName

    If (!(Test-Path -Path $destinationPath -PathType Leaf)) { 

        Write-Host "Downloading $packageName" 
        $webClient = New-Object System.Net.WebClient 
        $webClient.DownloadFile($package.url,$destinationPath) 
        #Start-Sleep -s 10
    }

    #Once we've downloaded all our files lets install them. 
    foreach ($package in $packages) { 
        $packageName = $package.title 
        $fileName = Split-Path $package.url -Leaf 
        $destinationPath = Join-Path $package.Destination $fileName 
        $Arguments = $package.Arguments 
        Write-Output "Installing $packageName" 

        Invoke-Expression -Command "$destinationPath $Arguments" 
    }
}

1 Ответ

0 голосов
/ 15 мая 2018

https://winscp.net/download/WinSCP-5.13.1-Setup.exe не является URL для загрузки. Это страница загрузки. Ваш код загружает HTML-документ, а не исполняемый двоичный файл.

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

Приведенный выше URL-адрес дает вам исполняемый файл только потому, что HTML-код, который он возвращает, содержит код JavaScript, который перенаправляет ваш браузер на URL-адрес одноразовой загрузки. Конечно, вы можете реализовать то же самое (получить HTML и найти / сгенерировать загрузочный URL, используя данные, которые он возвращает). Но это оскорбление.

...