I created a form in powershell and I would like to redirect the status that shows in the ISE to a popup. Currently when I run the script outside of ISE I do not see the status bar, but seeing it would be very helpful.
Here is the function
Function Upload-File {
param (
$LocalData
)
Add-PSSnapin ShareFile
#Run the following interactively to create a login token that can be used by Get-SfClient in unattended scripts
$sfClient = Get-SfClient -Name ((Join-Path $env:USERPROFILE "Documents\Sharefile") "\MySubdomain.sfps")
#upload directory is relative to the root of the account
#get the current user's home folder to use as the starting point
$ShareFileHomeFolder = (Send-SfRequest $sfClient -Entity Items).Url
# Create a PowerShell provider for ShareFile pointing to Personal Folsers\Send
New-PSDrive -Name sfDrive -PSProvider ShareFile -Client $sfClient -Root "\Personal Folders\Send" -RootUri $ShareFilePath
#upload all the files (recursively) in the local folder to the specified folder in ShareFile
Copy-SfItem -Path $LocalData -Destination "sfDrive:"
#Remove the PSProvider when we are done
Remove-PSDrive sfdrive
}
When it runs in ISE
Is there a way to redirect that to a pop-up window?
This is the command to call the function
Start-Process (Upload-File -LocalData "$LocalData") -Wait
I saw the write-progress command but didn't see how I could apply it here. Should I be doing something different?
CodePudding user response:
Found this Write-progress during Start-process -Wait and ajusted it to your scenario. The general idea os to replace the wait with bypass and let a loop run until $process.hasexited:
$process =Start-Process (Upload-File -LocalData "$LocalData") -PassThru
for($i = 0; $i -le 100; $i = ($i 1) % 100)
{
Write-Progress -Activity "copier" -PercentComplete $i -Status "copying"
Start-Sleep -Milliseconds 100
if ($process.HasExited) {
Write-Progress -Activity "copier" -Completed
break
}
}
However the status in this case is only a counter, but u could replace it with something real and change the for-loop to this:
Do{
write-progress…
}while(-not $process.HasExited)
CodePudding user response:
As per my comment, you must add form/gui resources/namespaces to the top of your code when running from the consoles, for form stuff to load since they are not auto-loaded as they are in the ISE.
Note: You don't need all of the namespaces. I only put these here to make you aware of the most common ones used in PS GUI scenarios.
Add-Type -AssemblyName System.Drawing,
PresentationCore,
PresentationFramework,
System.Windows.Forms,
microsoft.VisualBasic
[System.Windows.Forms.Application]::EnableVisualStyles()
$Form = New-Object System.Windows.Forms.Form
$Form.width = 400
$Form.height = 600
$Form.Text = 'Add Resource'
$Form.StartPosition = 'CenterScreen'
$pbrTest = New-Object System.Windows.Forms.ProgressBar
$pbrTest.Maximum = 100
$pbrTest.Minimum = 0
$pbrTest.Location = new-object System.Drawing.Size(10,10)
$pbrTest.size = new-object System.Drawing.Size(100,50)
$i = 0
$Form.Controls.Add($pbrTest)
$btnConfirm = new-object System.Windows.Forms.Button
$btnConfirm.Location = new-object System.Drawing.Size(120,10)
$btnConfirm.Size = new-object System.Drawing.Size(100,30)
$btnConfirm.Text = 'Start Progress'
$Form.Controls.Add($btnConfirm)
$btnConfirm.Add_Click({
While ($i -le 100)
{
$pbrTest.Value = $i
Start-Sleep -m 1
'VALUE EQ'
$i
$i = 1
}
})
$Form.Add_Shown({$Form.Activate()})
$Form.ShowDialog()