# PowerShell Install msi silently

PowerShell. I sometimes need to use it. Whenever I use it, I have to google it to know how to do it.

This time, I needed to create a PowerShell script to install msi file silently.

## msiexec with relative path does not work

This is what I did at first.

# This does not work
Start-Process msiexec.exe -Wait -ArgumentList "/I .\Something.msi /quiet"

Start-Process with Wait option is used here to wait for the process completion.

But the target application was not installed in the system. It turned out that the relative path can’t be passed here.

## How to get the current path

To make it the absolute path, the current path is needed. I tried to use Get-Location first.

$current = Get-Location$joinedPath = Join-Path $current "Something.msi" Write-Host$joinedPath

But Get-Location returns the current directory path but not the path for the PowerShell script. If the execution directory is different from the directory where the PowerShell script exists, the path becomes the non-desired path. So this way is not good.

A better way is to use $PSScriptRoot that returns a path to the currently executed PowerShell script. $absolutePathToMsi = Join-Path $PSScriptRoot "Something.msi" Write-Host$absolutePathToMsi

We can generate the desired path in this way because we already know where the target file exists. If the file exists in bins directory, the code will be the following.

$absolutePathToMsi = Join-Path$PSScriptRoot "/bins/Something.msi"