Ste
Ste

Reputation: 2293

Win-PS2EXE - Respect the location of the resulting executable

Take these settings for the program Win-PS2EXE:

This is so that the console will show when the exe file is clicked on.

Win-PS2EXE

And this code:

$inf_file = "$PSScriptRoot\setup-files\install.inf"
write-host """$inf_file"""
timeout 10

Let us say that the path of the new executable is W:\Apps\Install Scheme.exe

Which means the $inf_file is here W:\Apps\setup-files\install.inf


When I click the converted exe file I get this.

enter image description here

Is there any way to get the correct path of W:\Apps\setup-files\install.inf so that the executable recognises the location of itself when clicked.

I thought that $PSScriptRoot would work.

I'm lost as to how to get around this as the exe file will eventually depend on knowing its location.

Upvotes: 1

Views: 3906

Answers (2)

mklement0
mklement0

Reputation: 439587

To offer a pragmatic, concise alternative (PSv3+) that always reports the script path as a full path:

One-liner:

$scriptDir = if (-not $PSScriptRoot) { Split-Path -Parent (Convert-Path ([Environment]::GetCommandLineArgs()[0])) } else { $PSScriptRoot }

Annotated form:

$scriptDir = if (-not $PSScriptRoot) {  # $PSScriptRoot not defined?
    # Get the path of the executable *as invoked*, via
    # [environment]::GetCommandLineArgs()[0],
    # resolve it to a full path with Convert-Path, then get its directory path
    Split-Path -Parent (Convert-Path ([Environment]::GetCommandLineArgs()[0])) 
  } 
  else {
    # Use the automatic variable.
    $PSScriptRoot 
  }

Upvotes: 4

Ste
Ste

Reputation: 2293

Here's the code that can accomplish that.

Function Get-PSScriptPath {

<#

.SYNOPSIS
Returns the current filepath of the .ps1 or compiled .exe with Win-PS2EXE.

.DESCRIPTION
This will return the path of the file. This will work when the .ps1 file is
converted with Win-PS2EXE

.NOTES
Author: Ste
Date Created: 2021.05.03
Tested with PowerShell 5.1 and 7.1.
Posted here: https://stackoverflow.com/q/60121313/8262102

.PARAMETER None
NA

.INPUTS
None. You cannot pipe objects to Get-PSScriptPath.

.OUTPUTS
Returns the current filepath of the .ps1 or compiled .exe with Win-PS2EXE.

.EXAMPLE (When run from a .ps1 file)
PS> Get-PSScriptPath
PS> C:\Users\Desktop\temp.ps1

.EXAMPLE (When run from a compiled .exe file with Win-PS2EXE.
PS> Get-PSScriptPath
PS> C:\Users\Desktop\temp.exe

#>

if ([System.IO.Path]::GetExtension($PSCommandPath) -eq '.ps1') {
  $psScriptPath = $PSCommandPath
  } else {
    # This enables the script to be compiles and get the directory of it.
    $psScriptPath = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName
  }
  return $psScriptPath
}

Get-PSScriptPath

Upvotes: 4

Related Questions