Is there a way to add utilities to the Windows PS ISE?

I had assumed that the Windows PowerShell ISE is a take-it-as-it-is ISE (Integrated Scripting Environment) or IDE (Integrated Development Environment).

But a very helpful response (to a previous question I posted) …

… inspired me to ask if there is some way to add utilities to the Windows PowerShell ISE, such as, for example:

  1. A toolbar item (or a keystroke) to comment or uncomment a block of lines;
  2. To sort lines alphabetically;
  3. To trim white space;
  4. To create tools. For example, in another IDE (EditPadPro) I coded a “tool” that calls a script that makes a .rar archive copy of the current version of the PowerShell script on which I am working. I wish I could have the same tool available I am using the Windows PowerShell ISE.

Maybe the Windows PowerShell ISE is just a take-it-as-it-is ISE (Integrated Scripting Environment) or IDE (Integrated Development Environment), and no such embellishments can be made. But I thought that there’s no harm in asking.

There has been a software called ISESteroids, but since MSFT stoppped the development of the PowerShell_ISE I’d expect the AddOns - if they still exist - will disappear soon as well. Especially since the PowerShell_ISE is not able to work with PowerShell core out of the box. :man_shrugging:t3:

There are numerous plugins for VSCode for alomst every thinkable purpose. I’d recommend to focus on that modern and actively developed IDE. :wink:

4 Likes

Thank you yet again. How do I indicate that you provided the “solution” or “answer” to my question?

I’m glad if it helped. :slightly_smiling_face: :love_you_gesture:t3:

That’s only available for questions with the category “PowerShell Help”. But since the question was not actually about PowerShell code I categorized it as “Open Discussion” and “shell-business”. :+1:t3:

I have a paid license for IseSteroids. I don’t use ISE to write the bulk of my code - for that I either use Notepad++ or Visual Studio Code.

Where I do still use ISE and IseSteroids is when I plan on releasing a script to others I use its syntax checking to catch and ensure that parameters are called explicitly with the actual name of the parameter and not a shortening of it. I believe that a script that is given to others it should not contain any aliases and every parameter should be used explicitly and not use parameter position to properly parse and execute the command line.

Hello,
As it is an open discussion …
I admired this afternoon as PowerShell ISE has nice features, and readable fonts without doing anything for that (except for the list of cmdlets), which is not that frequent on Windows 10/11.
It would be a good idea Microsoft abandons IE and Edge, that would leave them time to clean up things when needed, for instance update of the PowerShell help system.

The PowerShell_ISE is not actively developed anymore and only supports Windows PowerShell (5.1). MSFT invests all efforts into VSCode now. It is highly customizable and much much more advanced than the old PowerShell_ISE.

They already did that. :man_shrugging:t3:

While it’s actually off topic for this thread … what kind of update would you expect for the help system? :thinking:

Just after having typed Update-Help (and waited for it to execute of course), in PowerShell ISE I selected Compare-Object in the select interface on the right.
Then I clicked on the blue question mark help button.
It displayed a help for Compare-Object, with a readable font which is somewhat exceptional on Windows 10/11, but it ends with a remark, that begins by something like “Get-Help cannot find the help files for this command applet on this computer. It only finds a partial one.”

Again … PowerShell_ISE reached its end of life actually. There will not be any improvements anymore.

If you want to display the help for any cmdlet or topic in a separate window you can use the parameter -ShowWindow from any console (version 5.1 or 7.x). For example:

Get-Help Compare-Object -ShowWindow

or

Get-Help about_functions_advanced_parameter -ShowWindow

And you can even zoom in or out in this window with <Strg>+<+> and <Strg>+<-> or by holding the <Strg> key and using the mouse wheel. How about that? :man_shrugging:t3:
Or if you could use the parameter -Online what opens the help topic in a browser tab of your default browser.

Get-Help Compare-Object -Online

With either way you have the advantage not to pollute your console window with a lot of text you need to scroll up and down. :point_up:t3: :+1:t3: :love_you_gesture:t3:

<$.02>

I know this is an old thread, but I as well have a paid for subscription to ISESteroids. My sole use for the add on is to build an EXE. It is by far the best tool I have used to get this done for Windows PowerShell, not to mention the author is EXTREMELY good at getting back to you in e-mail if you have questions. He even helped me get an EXE built for PowerShell 2.0. The dude is amazing.

</$.02>

1 Like

PowerShell ISE has limited options for adding custom tools or buttons—it’s mostly a basic editor without plugin support. You can add some functions via scripts, but it’s not very flexible.

If you want more features like block commenting, sorting lines, or custom tools, I recommend using Visual Studio Code with the PowerShell extension. It’s much easier to customize and more powerful.

The answer is yes, there were ways to add 3rd party add-ons into PowerShell ISE. For example when PSScriptAnalyzer first came out it was an add-on into PowerShell_ISE. There were others out there. I’m not sure that community would be that active today but you may still find them if you search the Internet, or an LLM may be able to help you find some.

Everyone will say it’s deprecated, but all that means is it’s no longer developed nor does Microsoft make new features for it. However, it continues to run and I use it every single day. I believe the main guy at Microsoft’s name was Heman (no not the cartoon) I forget the last name but I believe he is still at Microsoft. I follow him on twitter, or X but he has not posted in a couple years.

deprecated
adjective
dep·​re·​cat·​ed | \ ˈde-prə-ˌkā-təd
Definition:

No longer recommended for use; considered obsolete or superseded, especially in reference to software, technology, or practices that remain functional but are discouraged due to newer, preferred alternatives.
e.g. “The API method GetUserData() is deprecated and will be removed in future versions.”

*Disapproved of or expressed disfavor toward, often formally or officially.
Archaic usage: “The council deprecated the use of such language in public discourse.”

Or my definition: Hey it still runs come pry it from my cold dead hands!!!*

Powershell Pro tools module can also generate exe and it’s free now

Powershell Pro tools module can also generate exe and it’s free now

I played with this some time back, over a year ago and never got it working. Their support was not very good at that time either. My hope was to build an EXE that supported PowerShell core but never got that working. Got any tips on that Doug? I would love to re-visit.

Well for a kind and generous human like you, I absolutely will share some tips. Here is a modified version of snippet from one of my production scripts. A couple of things to note

  1. If you run all the code as it is it will generate an exe with pscore. Change $configexample to 0 to use the windows powershell config example..
  2. The path for the windows powershell version icon needs to be filled out and uncommented in the config.
  3. The added Import-Module commands are so the pscore version has those modules available, it’s a quirk for just that version.
  4. Obfuscation is neat but will surely trigger many more security products
  5. The pscore version will be much larger in size than the windows powershell version

Enjoy!

$Path = $env:TEMP # choose your own path, a folder where the script.ps1, config.psd1, and generated executable will be stored
$scriptfile = Join-Path $Path script.ps1
$configfile = Join-Path $Path package.psd1
$destination = 'google.com'
$psicon = '\path\to\your\icon.file'
$pscoreicon = 'C:\Program Files\PowerShell\7\assets\Powershell_black.ico'
$configexample = 1 # 0 for windows powershell, 1 for ps core

$ErrorActionPreference = 'Stop'

$modulelist = @'
    Name,Version
    PowershellProTools,2025.2.0
'@ | ConvertFrom-Csv

foreach($module in $modulelist){
    Write-Host "Verifying $($module.Name) module is installed" -ForegroundColor Cyan

    $installed = Get-Module -ListAvailable -Name $module.Name |
        Sort-Object -Property {[version]$_.version} | Select-Object -Last 1

    if(-not $installed -or [version]$installed.version -lt [version]$module.Version){
        $found = Find-Module -Name $module.Name -AllVersions |
                Sort-Object -Property {[version]$_.version} | Select-Object -Last 1

        Write-Host "Installing $($module.Name) $($found.Version)" -ForegroundColor Cyan
        $found | Install-Module -Force -Scope CurrentUser
    }
}

$scriptcontents = @'
Import-Module NetTCPIP -Force
Import-Module DnsClient -Force

$host.UI.RawUI.WindowTitle = '{0} pinger v1.0'

Write-Host "Pinger utility running in PS version $($PSVersionTable.PSVersion)" -ForegroundColor Cyan

Write-Host "Testing connection to {0}" -ForegroundColor Cyan

Test-NetCOnnection -ComputerName {0}

Write-Host "Completed connection test to {0}" -ForegroundColor Cyan

Write-Host "Press enter to continue" -ForegroundColor Cyan

Read-Host
'@ -f $destination

$configcontents = @(
# Powershell 5/.net 4.x
@"
@{
    Root = '$scriptfile'
    OutputPath = '$Path'
    Package = @{
        Enabled = `$true
        Obfuscate = `$false
        HideConsoleWindow = `$false
        DotNetVersion = 'v4.6.2'
        FileVersion = '1.0.4'
        FileDescription = 'Utility to ping $destination'
        Platform = 'x64'
        ProductName = '$destination pinger'
        ProductVersion = '2.2'
        Copyright = '© 2025 KrzyDoug'
        RequireElevation = `$false
        #ApplicationIconPath = '$((Get-Command powershell.exe).source)'
        PackageType = 'Console'
    }
    Bundle = @{
        Enabled = `$true
        Modules = `$true
        # IgnoredModules = @()
    }
}
"@

# Powershell core/.net core
@"
@{
    Root = '$scriptfile'
    OutputPath = '$Path'
    Package = @{
        Enabled = `$true
        Obfuscate = `$false
        HideConsoleWindow = `$false
        DotNetVersion = 'net9.0'
        FileVersion = '1.0.4'
        FileDescription = 'Utility to ping $destination'
        Platform = 'x64'
        PowerShellVersion = '7.5.0'
        ProductName = '$destination pinger'
        ProductVersion = '2.2'
        Copyright = '© 2025 KrzyDoug'
        RequireElevation = `$false
        ApplicationIconPath = '$pscoreicon'
        PackageType = 'Console'
    }
    Bundle = @{
        Enabled = `$true
        Modules = `$true
        # IgnoredModules = @()
    }
}
"@
)[$configexample]

try{
    Set-Content -LiteralPath $scriptfile -Value $scriptcontents
    Write-Host "$scriptfile created successfully" -ForegroundColor Cyan
}
catch{
    Write-Warning $_.exception.message
    Exit 1
}

try{
    Set-Content $configfile -Value $configcontents
    Write-Host "$configfile created successfully" -ForegroundColor Cyan
}
catch{
    Write-Warning $_.exception.message
    Exit 1
}

Write-Host "Packaging $scriptfile as exe file" -ForegroundColor Cyan

Start-Sleep -Seconds (Get-Random (2..4))

try{
    $outputfile = Merge-Script -ConfigFile $configfile
    Write-Host "Executable package $($outputfile.OutputFileName) created successfully" -ForegroundColor Cyan
}
catch{
    Write-Warning $_.exception.message
    Exit 1
}

Write-Host "Press enter to continue" -ForegroundColor Cyan

Read-Host
explorer /select,$outputfile.OutputFileName

More info

Wow, very nice and very much appreciated Doug :grinning_face:

I will report back my success. Thanks again !

Quick update … first and foremost, I dont want to take up a bunch of your time.

Your script worked fine. The problem seems to be either with the conversion, or my script.

My script is big. The initial problem is that the conversion for some reason always returns $ENV:Temp for $PSScriptRoot. So, my script is unable to find/load modules and dll’s I am loading from the same folder as the script.

Again, if you this is not an easy fix, don’t waste your time. It is not the end of the world not being able to use PSCore, it just runs orders of magnitude faster in my case than Windows Powershell.

Thanks again for the time you have provided.

Interesting, yeah it doesn’t affect the windows powershell version. That is quite frustrating

Hi Tony,

It appears $pwd and [environment]::CurrentDirectory both work.

You da man Doug !!! Worked perfectly. THANK YOU !

I chose to use [environment]::CurrentDirectory

1 Like