YouYyn
YouYyn

Reputation: 239

Powershell download and run exe file

i need to download file from website and then run this file. File is in exe format. I tried many commands, but unsuccessfully. Could you help me. Thanks a lot for help and have a nice day.

Upvotes: 19

Views: 62721

Answers (2)

Dr Phil
Dr Phil

Reputation: 807

As an alternative to Invoke-WebRequest, I prefer Start-BitsTransfer which is much faster. On my system, for a 90MB file the difference was 10 seconds vs 100 seconds.

Here's an example script that downloads and installs VS Code silently. Adapted from here

$FileUri = "https://update.code.visualstudio.com/latest/win32-x64-user/stable"
$Destination = "D:/downloads/vscodeInstaller.exe"

$bitsJobObj = Start-BitsTransfer $FileUri -Destination $Destination

switch ($bitsJobObj.JobState) {

    'Transferred' {
        Complete-BitsTransfer -BitsJob $bitsJobObj
        break
    }

    'Error' {
        throw 'Error downloading'
    }
}

$exeArgs = '/verysilent /tasks=addcontextmenufiles,addcontextmenufolders,addtopath'

Start-Process -Wait $Destination -ArgumentList $exeArgs

Upvotes: 1

Bryce McDonald
Bryce McDonald

Reputation: 1870

The script you are wanting is going to do two things. First, we will download a file and store it in an accessible location. Second, we will then run the executable with whatever arguments we need to have it install successfully.

Step 1:

We have two ways of accomplishing this task. The first is to use Invoke-Webrequest. The only two arguments we need for it will be the URL of the .exe file, and where we want that file to go on our local machine.

$url = "http://www.contoso.com/pathtoexe.exe"
$outpath = "$PSScriptRoot/myexe.exe"
Invoke-WebRequest -Uri $url -OutFile $outpath

I use $PSScriptRoot here because it will let me drop the exe right next to where the Powershell script is running, but feel free to put a path of your choice in, like C:/temp or downloads or whatever you want. You may notice that with larger files, the Invoke-WebRequestmethod takes a long time. If this is the case, we can call .Net directly and hopefully speed things up.

We will set our variables of $url and $outpath the same, but instead of Invoke-WebRequest we will use the following .Net code:

$wc = New-Object System.Net.WebClient
$wc.DownloadFile($url, $outpath)

Step 2:

Calling an executable is the easy part.

$args = @("Comma","Separated","Arguments")
Start-Process -Filepath "$PSScriptRoot/myexe.exe" -ArgumentList $args

And that should just about do it for you.

Upvotes: 27

Related Questions