I have a PS script written to apply some basic configuration to a device over a COM connection. After some user input is recorded, it is used to format a minified java string to send to the device over USB. My issue is that powershell is applying syntax rules to this minified javascript string when I don't want it. I can sucefully send command to the device if they don't contain the javascript, stuff like device Restart etc work fine.
I'm unsure how to work around this, does anyone have a simple solution?
Here's the errors when I try to run it:
At line:146 char:22
+ $port.Write("3,{"bankName":"$bankName","bankId":"0","footswitches ...
+ ~
Missing ')' in method call.
At line:146 char:22
+ ... .Write("3,{"bankName":"$bankName","bankId":"0","footswitches":[{"name ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'bankName":"$bankName","bankId":"0","footswitches":[{"name":"$FS1
"},{"name":"$FS2"},{"name":"$FS3"},{"name":"$FS4"},{"name":"$FS5"},{"name":"$FS6"}
]}~"' in expression or statement.
At line:126 char:1
+ {
+ ~
Missing closing '}' in statement block or type definition.
At line:146 char:172
+ ... ,{"name":"$FS3"},{"name":"$FS4"},{"name":"$FS5"},{"name":"$FS6"}]}~")
+ ~
Unexpected token ')' in expression or statement.
At line:149 char:1
+ }
+ ~
Unexpected token '}' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordExcep
tion
+ FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
Here's the full script:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Bridge Namer'
$form.Size = New-Object System.Drawing.Size(300,400)
$form.StartPosition = 'CenterScreen'
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,320)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(150,320)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'What Bank Number do you want to Re-Name?'
$form.Controls.Add($label)
$textBoxbankNumber = New-Object System.Windows.Forms.TextBox
$textBoxbankNumber.Location = New-Object System.Drawing.Point(10,40)
$textBoxbankNumber.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBoxbankNumber)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,70)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'New Bank Name:'
$form.Controls.Add($label)
$textBoxbankName = New-Object System.Windows.Forms.TextBox
$textBoxbankName.Location = New-Object System.Drawing.Point(10,90)
$textBoxbankName.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBoxbankName)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,120)
$label.Size = New-Object System.Drawing.Size(120,20)
$label.Text = 'Footswitch 1 Name:'
$form.Controls.Add($label)
$textBoxFS1 = New-Object System.Windows.Forms.TextBox
$textBoxFS1.Location = New-Object System.Drawing.Point(10,140)
$textBoxFS1.Size = New-Object System.Drawing.Size(120,20)
$form.Controls.Add($textBoxFS1)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(150,120)
$label.Size = New-Object System.Drawing.Size(120,20)
$label.Text = 'Footswitch 2 Name:'
$form.Controls.Add($label)
$textBoxFS2 = New-Object System.Windows.Forms.TextBox
$textBoxFS2.Location = New-Object System.Drawing.Point(150,140)
$textBoxFS2.Size = New-Object System.Drawing.Size(120,20)
$form.Controls.Add($textBoxFS2)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,170)
$label.Size = New-Object System.Drawing.Size(120,20)
$label.Text = 'Footswitch 3 Name:'
$form.Controls.Add($label)
$textBoxFS3 = New-Object System.Windows.Forms.TextBox
$textBoxFS3.Location = New-Object System.Drawing.Point(10,190)
$textBoxFS3.Size = New-Object System.Drawing.Size(120,20)
$form.Controls.Add($textBoxFS3)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(150,170)
$label.Size = New-Object System.Drawing.Size(120,20)
$label.Text = 'Footswitch 4 Name:'
$form.Controls.Add($label)
$textBoxFS4 = New-Object System.Windows.Forms.TextBox
$textBoxFS4.Location = New-Object System.Drawing.Point(150,190)
$textBoxFS4.Size = New-Object System.Drawing.Size(120,20)
$form.Controls.Add($textBoxFS4)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,220)
$label.Size = New-Object System.Drawing.Size(120,20)
$label.Text = 'Footswitch 5 Name:'
$form.Controls.Add($label)
$textBoxFS5 = New-Object System.Windows.Forms.TextBox
$textBoxFS5.Location = New-Object System.Drawing.Point(10,240)
$textBoxFS5.Size = New-Object System.Drawing.Size(120,20)
$form.Controls.Add($textBoxFS5)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(150,220)
$label.Size = New-Object System.Drawing.Size(120,20)
$label.Text = 'Footswitch 6 Name:'
$form.Controls.Add($label)
$textBoxFS6 = New-Object System.Windows.Forms.TextBox
$textBoxFS6.Location = New-Object System.Drawing.Point(150,240)
$textBoxFS6.Size = New-Object System.Drawing.Size(120,20)
$form.Controls.Add($textBoxFS6)
$form.Topmost = $true
$form.Add_Shown({$textBoxbankNumber.Select()})
$form.Add_Shown({$textBoxbankName.Select()})
$form.Add_Shown({$textBoxFS1.Select()})
$form.Add_Shown({$textBoxFS2.Select()})
$form.Add_Shown({$textBoxFS3.Select()})
$form.Add_Shown({$textBoxFS4.Select()})
$form.Add_Shown({$textBoxFS5.Select()})
$form.Add_Shown({$textBoxFS6.Select()})
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$bankNumber = $textBoxbankNumber.Text
$bankName = $textBoxbankName.Text
$FS1 = $textBoxFS1.Text
$FS2 = $textBoxFS2.Text
$FS3 = $textBoxFS3.Text
$FS4 = $textBoxFS4.Text
$FS5 = $textBoxFS5.Text
$FS6 = $textBoxFS6.Text
$port= new-Object System.IO.Ports.SerialPort COM6,9600,None,8,one
$port.DtrEnable = "true"
$port.open()
Start-Sleep -Milliseconds 50
$port.Write("0,RSET~")
Start-Sleep -Milliseconds 50
$port.Write("1,DTXR~")
Start-Sleep -Milliseconds 50
$port.Write("2,bankSettings,$bankNumber~")
Start-Sleep -Milliseconds 50
$port.Write("3,{"bankName":"$bankName","bankId":"0","footswitches":[{"name":"$FS1"},{"name":"$FS2"},{"name":"$FS3"},{"name":"$FS4"},{"name":"$FS5"},{"name":"$FS6"}]}~")
Start-Sleep -Milliseconds 50
$port.close()
}
Well without a suggested serial port string a correct answer is hard to construct. I just double quoted your quotes in my example (That will fix the PS part). Since your implied output statement is valid java string, i somehow guessed your desired output.
$FS1 = "a"
$FS2 = "b"
$FS3 = "c"
$FS4 = "d"
$FS5 = "e"
$FS6 = "f"
$bankName = "bar"
$port.Write("3,{""bankName"":""$bankName"",""bankId"":""0"",""footswitches"":[{""name"":""$FS1""},{""name"":""$FS2""},{""name"":""$FS3""},{""name"":""$FS4""},{""name"":""$FS5""},{""name"":""$FS6""}]}~")
OutPut
3,{"bankName":"bar","bankId":"0","footswitches":[{"name":"a"},{"name":"b"},{"name":"c"},{"name":"d"},{"name":"e"},{"name":"f"}]}~
Sorry, I thought I'd already answered this. I got around this problem by masking the quotations in this way:
$port.Write("3,{`"bankName`":`"$bankName`",`"bankId`":`"0`",`"footswitches`":[{`"name`":`"$FS1`"},{`"name`":`"$FS2`"},{`"name`":`"$FS3`"},{`"name`":`"$FS4`"},{`"name`":`"$FS5`"},{`"name`":`"$FS6`"}]}~")
Related
I'm new to Powershell and I would like to write a script to make it easier for end users to add a network printer to their system.
I want to list all the network printer in the listbox, but instead of listing all printer names, I get this:
Here's my code
#window
$window = New-Object System.Windows.Forms.Form
$window.Text = 'Select a Printer'
$window.Size = New-Object System.Drawing.Size(500, 400)
$window.StartPosition = 'CenterScreen'
#Button
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(340,130)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$window.AcceptButton = $okButton
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(340,240)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$window.CancelButton = $cancelButton
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Please select a printer'
$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,60)
$listBox.Size = New-Object System.Drawing.Size(260,20)
$listBox.Height= 280
$listBox.Items.Add((Get-Printer -ComputerName srvpr01| select $_.Name))
$window.Controls.Add($listBox)
$window.controls.Add($label)
$window.Controls.Add($cancelButton)
$window.Controls.Add($okButton)
$result = $window.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x = $listBox.SelectedItem
$x
}
You know any way I can list the printer names instead of this Object?
I appreciate every type of help and feedback!
You need to use a loop to add the items to the listbox.
Change this line
$listBox.Items.Add((Get-Printer -ComputerName srvpr01| select $_.Name))
to this:
Get-Printer -ComputerName srvpr01 | ForEach-Object { $listBox.Items.Add($_.Name) }
Trying to create a simple GUI Script using powershell to ping a TP ip address and display it with a simple Green/Red Image depending whether its on/off.
But for some reason, when hitting the Close button, I cant seem to remove the green/red dots.
The File contains:
Arial,172.0.0.0
Bodoni,172.0.0.0
Caslon,172.0.0.1
Script:
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$Form = New-Object System.Windows.Forms.Form
$Form.text = "Hardware Checks"
$Form.Size = New-Object System.Drawing.Size(600,600)
$arrayTPs = Get-Content -path "C:\Activity monitor\TPs.txt"
#Image Locations
$filered = (get-item 'C:\Activity monitor\red1.png')
$filegreen = (get-item 'C:\Activity monitor\green1.png')
$imgred = [System.Drawing.Image]::Fromfile($filered)
$imggreen = [System.Drawing.Image]::Fromfile($filegreen)
$outputBox = New-Object System.Windows.Forms.TextBox
$outputBox.Location = New-Object System.Drawing.Size(10,200)
$outputBox.Size = New-Object System.Drawing.Size(565,200)
$outputBox.MultiLine = $True
$outputBox.ScrollBars = "Vertical"
$Form.Controls.Add($outputBox)
$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(450,30)
$Button.Size = New-Object System.Drawing.Size(75,75)
$Button.Text = "Check"
$Button.Add_Click({
$Form.controls.Remove($outputBox)
$Form.controls.refresh()
foreach($room in $arrayTPs){
#Get Name of room from array
$roomAlone = $room -split ","
$roomAlone[0]
$pictureBoxRed = new-object Windows.Forms.PictureBox
$pictureBoxGreen = new-object Windows.Forms.PictureBox
#Add room name to textbox
if($roomAlone[1] -eq "172.0.0.0"){
$pictureBoxGreen.Width = 10
$pictureBoxGreen.Height = 10
$pictureBoxGreen.Image = $imggreen
$pictureBoxGreen.Location = New-Object System.Drawing.Point(90,$counterpic)
$outputBox.controls.add($pictureBoxGreen)
$Form.Controls.Add($outputBox)}
else{
$pictureBoxRed.Width = 10
$pictureBoxRed.Height = 10
$pictureBoxRed.Image = $imgred
$pictureBoxRed.Location = New-Object System.Drawing.Point(90,$counterpic)
$outputBox.controls.add($pictureBoxRed)
$Form.Controls.Add($outputBox)
}
$counterpic = $Counterpic + 20
$counter = $Counter + 20
}})
$Form.Controls.Add($Button)
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Size(450,520)
$cancelButton.Size = New-Object System.Drawing.Size(75,25)
$cancelButton.Text = "Close"
$cancelButton.Add_Click({
$outputBox.controls.Remove($pictureBoxRed)
$outputBox.controls.Remove($pictureBoxGreen)
$outputBox.Controls.Equals($null)
$outputBox.controls.update()
$Form.Refresh()
foreach($room in $arrayTPs){
#Get Name of room from array
$roomAlone = $room -split ","
$roomAlone[0]
$pictureBoxRed = new-object Windows.Forms.PictureBox
$pictureBoxGreen = new-object Windows.Forms.PictureBox
}})
$Form.Controls.Add($cancelButton)
$Form.Add_Shown({$Form.Activate()})
[void] $Form.ShowDialog()
I am writing a script to get the data from user input as date, when I select another date it is not displaying in text box, please suggest where is the issue
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$Form = New-Object System.Windows.Forms.Form
$Form.Size = New-Object System.Drawing.Size(800,600)
$Form.Text = "test"
$Form.FormBorderStyle = "FixedDialog"
$TextBoxlabel = New-Object System.Windows.Forms.Label
$TextBoxlabel.Location = New-Object System.Drawing.Point(10,50)
$TextBoxlabel.Size = New-Object System.Drawing.Size(100,20)
$TextBoxlabel.Text = 'Input No:'
$form.Controls.Add($TextBoxlabel)
$TextBox = New-Object System.Windows.Forms.TextBox
$TextBox.Location = New-Object System.Drawing.Size(120,50)
$TextBox.Size = New-Object System.Drawing.Size(180,20)
$TextBox.MultiLine = $false
$TextBox.ScrollBars = "Vertical"
$Form.Controls.Add($TextBox)
$StartDatelabel = New-Object System.Windows.Forms.Label
$StartDatelabel.Location = New-Object System.Drawing.Point(10,100)
$StartDatelabel.Size = New-Object System.Drawing.Size(100,20)
$StartDatelabel.Text = 'Start Date:'
$form.Controls.Add($StartDatelabel)
$StartDateTextBox = New-Object System.Windows.Forms.TextBox
$StartDateTextBox.Location = New-Object System.Drawing.Size(120,100)
$StartDateTextBox.Size = New-Object System.Drawing.Size(100,20)
$StartDateTextBox.MultiLine = $false
$StartDateTextBox.ScrollBars = "Vertical"
$Form.Controls.Add($StartDateTextBox)
$Button1 = New-Object System.Windows.Forms.Button
$Button1.Location = New-Object System.Drawing.Size(220,100)
$Button1.Size = New-Object System.Drawing.Size(50,20)
$Button1.Text = "Date1"
$Button1.Add_Click({
$StartDateInput = New-Object System.Windows.Forms.MonthCalendar
$StartDateInput.ShowTodayCircle = $false
$StartDateInput.MaxSelectionCount = 1
$StartDateInput.Location = New-Object System.Drawing.Size(120,120)
$StartDateTextBox.Text = $StartDateInput.SelectionStart
$form.Controls.Add($StartDateInput)
})
$Form.Controls.Add($Button1)
$OutputTextBox = New-Object System.Windows.Forms.TextBox
$OutputTextBox.Location = New-Object System.Drawing.Size(10,320)
$OutputTextBox.Size = New-Object System.Drawing.Size(760,200)
$OutputTextBox.MultiLine = $true
$OutputTextBox.ScrollBars = "Vertical"
$OutputTextBox.ReadOnly = $true
$Form.Controls.Add($OutputTextBox)
$Form.Add_Shown({$Form.Activate()})
[void] $Form.ShowDialog()
when I am selecting the date (other than default date) it is not displaying in text box
I'm new to powershell and I need some help with a script.
I have a simple code which loops while the user doesn't type a name :
do {$name = Read-Host "Choose a name "}
while (!$name) {}
I try to use it for the GUI version but the loop doesn't stop :
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$box = {
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "Hostname"
$Form.Size = New-Object System.Drawing.Size(270,150)
$Form.StartPosition = "CenterScreen"
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(165,75)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$Form.AcceptButton = $OKButton
$Form.Controls.Add($OKButton)
$Label = New-Object System.Windows.Forms.Label
$Label.Location = New-Object System.Drawing.Size(10,15)
$Label.Size = New-Object System.Drawing.Size(280,20)
$Label.Text = "Choose a name :"
$Form.Controls.Add($Label)
$TextBox = New-Object System.Windows.Forms.TextBox
$TextBox.Location = New-Object System.Drawing.Size(10,40)
$TextBox.Size = New-Object System.Drawing.Size(230,20)
$Form.Controls.Add($TextBox)
$Form.Topmost = $True
$Form.Add_Shown({$TextBox.Select()})
$result = $Form.ShowDialog()
return $TextBox.Text
}
do {&$box}
while (!$TextBox.Text) {}
I think I'm missing something, but I don't know what...
Sorry for my poor english, thanks in advance.
Your textbox, being invoked, is never transmitted to its parent. Therefore, you need to assign your return value and works from there.
do {$value = &$box }
while ([String]::IsNullOrWhiteSpace($value))
Write-Host $value -ForegroundColor Cyan
Try this out.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
# Null out name value in case you need to call the script multiple times in the same PS session.
$name = $null
$box = {
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "Hostname"
$Form.Size = New-Object System.Drawing.Size(270,150)
$Form.StartPosition = "CenterScreen"
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(165,75)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$Form.AcceptButton = $OKButton
$Form.Controls.Add($OKButton)
$Label = New-Object System.Windows.Forms.Label
$Label.Location = New-Object System.Drawing.Size(10,15)
$Label.Size = New-Object System.Drawing.Size(280,20)
$Label.Text = "Choose a name :"
$Form.Controls.Add($Label)
$TextBox = New-Object System.Windows.Forms.TextBox
$TextBox.Location = New-Object System.Drawing.Size(10,40)
$TextBox.Size = New-Object System.Drawing.Size(230,20)
$Form.Controls.Add($TextBox)
$Form.Topmost = $True
$Form.Add_Shown({$TextBox.Select()})
$result = $Form.ShowDialog()
# Only return if the TextBox.Text is set to stop it from exiting immediately after rendering the form.
if ($TextBox.Text) {return $TextBox.Text}
}
# While the name variable is null, show the form again.
while (-not $name) {
$name = & $box
}
POWERSHELL ISE
Hi, I'm trying to write a program that will grab all .txt files in an input path, change the encoding, and send the new .txt files to an output location.
I have it working based on single text boxes. I'm not exactly sure how to set it where it grabs all .txt files instead of one. (maybe an array?) And output with same file name in a new location.
My question is how can I write this to grab all .txt files and output them all to a new location instead of doing a single file at a time?
Here is my current code:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = "Text Converter"
$form.Size = New-Object System.Drawing.Size(300,300)
$form.StartPosition = "CenterScreen"
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(55,230)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(150,230)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = "Input Path:"
$form.Controls.Add($label)
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,40)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,65)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = "Input Encoding:"
$form.Controls.Add($label)
$textBox2 = New-Object System.Windows.Forms.TextBox
$textBox2.Location = New-Object System.Drawing.Point(10,85)
$textBox2.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox2)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,115)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = "Output Path:"
$form.Controls.Add($label)
$textBox3 = New-Object System.Windows.Forms.TextBox
$textBox3.Location = New-Object System.Drawing.Point(10,140)
$textBox3.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox3)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,170)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = "Output Encoding"
$form.Controls.Add($label)
$textBox4 = New-Object System.Windows.Forms.TextBox
$textBox4.Location = New-Object System.Drawing.Point(10,190)
$textBox4.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox4)
$form.Topmost = $True
$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x = $textBox.Text
$x
$x2 = $textBox2.Text
$x2
$x3 = $textBox3.Text
$x3
$x4 = $textBox4.Text
$x4
}
Get-Content $x -encoding $x2 |
Set-Content $x3 -encoding $x4
If you want the user to select multiple files, you could use an OpenFileDialog control to allow the user to select multiple input files, and then add them to a ListBox rather than a TextBox:
# Use a ListBox, since we're going to keep track of multiple strings
$InputFileBox = New-Object System.Windows.Forms.ListBox
$InputFileBox.Location = New-Object System.Drawing.Point -ArgumentList 10,10
$InputFileBox.Size = New-Object System.Drawing.Size -ArgumentList 265,240
$Form.Controls.Add($InputFileBox)
# Set up the "OpenFile" dialog, set the Multiselect property
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.InitialDirectory = 'D:\test\forms'
$OpenFileDialog.Multiselect = $true
$OpenFileButton = New-Object System.Windows.Forms.Button
$OpenFileButton.Location = New-Object System.Drawing.Point -ArgumentList 220,265
$OpenFileButton.Size = New-Object System.Drawing.Size -ArgumentList 55,20
$OpenFileButton.Text = 'Browse!'
$OpenFileButton.add_Click({
if($OpenFileDialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK)
{
foreach($FileName in $OpenFileDialog.FileNames)
{
# only add files not already in the list
if(-not $InputFileBox.Items.Contains($FileName))
{
$InputFileBox.Items.Add($FileName)
}
}
}
})
$Form.Controls.Add($OpenFileButton)
You can then grab the files names either directly from the $OpenFileDialog.FileNames or from the ListBox if you want to allow the user to edit the list:
$FileNames = [string[]]$InputFileBox.Items
For the output directory, use a FolderBrowserDialog control:
# TextBox is fine here, but disable it so users can't type directly in it
$OutputFolderTextBox = New-Object System.Windows.Forms.TextBox
$OutputFolderTextBox.Location = New-Object System.Drawing.Point -ArgumentList 10,10
$OutputFolderTextBox.Size = New-Object System.Drawing.Size -ArgumentList 265,20
$OutputFolderTextBox.Enabled = $false
$OutputFolderTextBox.BackColor = [System.Drawing.Color]::White
$Form.Controls.Add($OutputFolderTextBox)
# set up FolderBrowserDialog control
$OutputFolderBrowserDialog = New-Object System.Windows.Forms.FolderBrowserDialog
$OutputFolderBrowserDialog.RootFolder = [System.Environment+SpecialFolder]::MyComputer
$OutputFolderBrowseButton = New-Object System.Windows.Forms.Button
$OutputFolderBrowseButton.Location = New-Object System.Drawing.Point -ArgumentList 220,40
$OutputFolderBrowseButton.Size = New-Object System.Drawing.Size -ArgumentList 55,20
$OutputFolderBrowseButton.Text = 'Browse!'
$OutputFolderBrowseButton.add_Click({
if($OutputFolderBrowserDialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK)
{
# grab the selected folder path
$OutputFolderTextBox.Text = $OutputFolderBrowserDialog.SelectedPath
}
})
$Form.Controls.Add($OutputFolderBrowseButton)