One of the things I do at work involves creating scripts to run a Ruby script. For each line in each script I create, I have to:
- Go to our secondary email program
- Copy a job name (a word, basically) or an entire line from an error email
- Change to an editing program (like the PowerShell Integrated Scripting Environment, a.k.a. ISE)
- Create a line with the Ruby command line and space for the text I’ve copied from the error email, and add the error email text to that line
Today, I had almost 120 lines to create this way – some of them in two versions
Previously, I did it all by hand – I duplicated the Ruby script portion as many times as I needed, then copied and pasted the error text.
Today, though, contemplating the 200+ lines to create, I decided to dig a bit deeper into the PowerShell ISE.
I discovered I could open a PowerShell script file from disk using:
PS P:\> New-Item -ItemType File test0.ps1
PS P:\> $PSISE.CurrentPowerShellTab.Files.Add(“P:\test0.PS1”)
I then found I could access the open files in the tabbed script panes using standard array indexing notation:
PS P:\> $PSISE.CurrentPowerShellTab.Files[7] # or [0], [1], [2], etc
With a little more experimentation, I found I could assign the tabbed script to a variable, Save its contents from the command line, and update the Text in the Editor property of the script pane:
PS P:\> $file0 = $PSISE.CurrentPowerShellTab.Files[7]
PS P:\> $file0.Editor.Text = “hello, world”
PS P:\> $file0.Editor.Text += “`n” + “Goodbye, cruel world”
PS P:\> $file0.Save()
PS P:\> Get-Content P:\test0.ps1
hello, world
Goodbye, cruel worldPS P:\>
I then discovered that I could access the current tab directly, without having to use the array indexing notation, or assign the tabbed script to a variable:
PS P:\> $PSISE.CurrentFile.Editor.Text = “”
I then adapted Recipe 8.3 (“Read and Write from the Windows Clipboard”) from the Windows PowerShell Cookbook to write a one-liner:
PS P:\> function Get-Clipboard { Add-Type -Assembly PresentationCore; [Windows.Clipboard]::GetText() }
Finally, I put the Ruby script lines into variables (for example, $ruby_script_1),
defined a new variable $PCE:
PS P:\> $PCE = $PSISE.CurrentFile.Editor
And used the results to add lines to the currently selected script tab:
PS P:\> $PCE.Text += $ruby_script_1 + (Get-Clipboard) + “`n”
# the `n is the PowerShell way to specify a newline character
Now, I just had to
- Switch to the email program,
- Copy the job name or full line out of the error email,
- Switch back to the PowerShell ISE, and
- Up-Arrow to create each new line
It looks like the same number of steps – but there’s a lot fewer keypresses, so…WIN!!!
One thought on “Editing PowerShell scripts from the ISE command line”