When I work in a command prompt, I’m used to start a new window by just typing ‘start’.

Unfortunately, it doesn’t work in a Powershell prompt as start is defined as the alias of the Start-Process cmdlet.

Get-Alias -Name Start

I was about to use the suggested one-liners that you can find on the following page:

http://stackoverflow.com/questions/15667322/how-to-open-powershell-console-window-from-powershell

Invoke-Item C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe # or start-process powershell

..But it doesn’t meet my needs perfectly.

I wrote for fun the following function that has also some limitations:

It’s unable to take in account the MTA (multithreaded apartment) mode vs. STA (single-threaded apartment. It always launches in STA and issues a warning if your parent window was in MTA.

It doesn’t use the console file and modules that were previously used that start the parent shell

It doesn’t use the arguments that were previously used that start the parent shell

Idem for the version of Powershell, the working directory, …

But it has the following advantages:

It takes into account whether it’s the ISE or the console, whether it’s a 32bit or a 64bit process

It keeps the default colors

It’s run under the same account and privileges

In other words, it just starts a new window as if you clicked on its shortcut in the start menu.

#Requires -Version 2.0 Function New-PSWindow { [cmdletBinding()] Param() Begin { # Is it a 32bit process $is32Bit = ([IntPtr]::size -eq 4) # Is it the ISE $isISE = (Get-Process -id $PID).ProcessName -match '_ise$' Switch -Regex ([Environment]::OSVersion.Version) { "^6\.1" { # Windows 7 $FilePath = 'C:\Programdata\Microsoft\Windows\Start Menu\Programs\Accessories\Windows PowerShell'; break; } "^6\.(2|3)" { # Windows 8 and 8.1 $FilePath = 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\System Tools' break; } default { $FilePath = $false } } # end of switch } Process { if ($FilePath) { # Define a string based on architecture if ($is32Bit) { $32BitPathStr = ' (x86)' } else { $32BitPathStr = [string]::Empty } # Define a string based on the type of host if ($isISE) { $ISEPathStr = ' ISE' } else { $ISEPathStr = [string]::Empty } try { # Launch the appropriate shortcut $nshl = Join-Path -Path (Resolve-Path -Path $FilePath -ErrorAction Stop) -ChildPath ("Windows Powershell",$ISEPathStr,$32BitPathStr,".lnk" -join "") if ($host.Runspace.ApartmentState -ne 'STA') { Write-Warning -Message "The new PS Window is not opened in MTA mode but in STA mode" } Invoke-Item -Path $nshl -ErrorAction Stop } catch { Write-Warning -Message "Failed to launch new PS Windows because $($_.Exception.Message)" } } else { $Msg = "Invalid OS: runs only on Windows 7/8/8.1 or 2008R2/2012/2012R2" throw (New-Object System.Exception -ArgumentList $Msg) } } } # end of function

I propose nps as alias for this function:

Set-Alias -Name nps -Value New-PSWindow

Have fun 😎