Path to Powershell.exe (v 2.0)
I believe it's in C:\Windows\System32\WindowsPowershell\v1.0\
. In order to confuse the innocent, MS kept it in a directory labeled "v1.0". Running this on Windows 7 and checking the version number via $Host.Version
(Determine installed PowerShell version) shows it's 2.0.
Another option is type $PSVersionTable
at the command prompt. If you are running v2.0, the output will be:
Name Value
---- -----
CLRVersion 2.0.50727.4927
BuildVersion 6.1.7600.16385
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
If you're running version 1.0, the variable doesn't exist and there will be no output.
Localization PowerShell version 1.0, 2.0, 3.0, 4.0:
- 64 bits version: C:\Windows\System32\WindowsPowerShell\v1.0\
- 32 bits version: C:\Windows\SysWOW64\WindowsPowerShell\v1.0\
I think $PsHome has the information you're after?
PS .> $PsHome C:\Windows\System32\WindowsPowerShell\v1.0 PS .> Get-Help about_automatic_variables TOPIC about_Automatic_Variables ...
Here is one way...
(Get-Process powershell | select -First 1).Path
Here is possibly a better way, as it returns the first hit on the path, just like if you had ran Powershell from a command prompt...
(Get-Command powershell.exe).Definition
It is always C:\Windows\System32\WindowsPowershell\v1.0. It was left like that for backward compability is what I heard or read somewhere.
To get the complete path to the currently running PowerShell, you can use this:
[System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName
The resulting path includes the PowerShell executable filename, which allows you to distinguish between PowerShell and PowerShell ISE (unlike $PsHome, which only shows you the PowerShell folder). Also, unlike Get-Process, it is not affected by other processes running on the system, so you always get the correct path for the current architecture (32-bit or 64-bit).
The GetCurrentProcess method is available from .NET Framework 1.1 and .NET Core 1.0, so this should work on any version of .NET/PowerShell.