Stream live output from background job?


hi. 

i have small powershell application runs background job. used learning more powershell, please dont laugh much:) application built in powershell studio forms application running powershell. have function; "pinginfo" collects data. when i'm running background job dont output application console or log-files creating. if dont run function background job works well. can give me hint how stream live data backgroun job(function) textbox , logfile while job running? want way keep application window open (it preventing input if dont run job in backgroud). if need can post project-files screens , on. "non-working" script. non-working means not output data application window of log-files. 

$onloadformevent={

#todo: initialize form controls here
$form=$mainform
$form.controls.add($textboxfind)
$form.controls.add($textboxtime)
$form.controls.add($logfoldernametext)
$form.controls.add($cmdoutput)
$form.controls.add($exitbutton)
$form.controls.add($buttonbrowsefolder)
$form.controls.add($logfolderapply)
$form.controls.add($viewlogsbutton)
$form.controls.add($logallno)
$form.controls.add($logallyes)
$form.controls.add($startpingbutton)
$form.controls.add($stopping)

}
$job1 = {pinginfo}
#initializing functions

# function: write output message when ping completed. 
function writecomplete {
write-output "`rping completed" | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()}
}

# function: show open folder dialog , return directory selected user.
function browsefolder {
$parameters = import-clixml -path "c:\$foldername\$configname" 
$logfoldername=$parameters['b']
explorer.exe "c:\$logfoldername"
}

# function: function ping selected target. 

function pinginfo {
$target=$textboxfind.text #we're taking text input box variable $serverinfo
$duration=$textboxtime.text
if ((($target).length) -lt "1") {
write-output "no target ip specified." | out-string -stream | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()}
write-output "example: check-pings.ps1 www.google.com" | out-string -stream | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()}
}
$didnt = 0
$worked = 0
$datetime = (get-date)
[datetime]$start_time=(get-date)
$finish_time=$start_time.addseconds($duration)
   
write-output "`nloading..." | out-string -stream | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()}
$ping = new-object system.net.networkinformation.ping
write-output "`rstarted ping $target $datetime`n" | out-string -stream | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()}
write-output "`rstarted ping $target $datetime`n" | out-file -append "c:\$logfoldername\$target.pingchecker.log"

while((get-date) -lt $finish_time) {

$go = $ping.send("$target") 
$result = $go.status 
$ms = $go.roundtriptime 
$ip = ($ping.send("$target").address).ipaddresstostring | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()}

if ($result -match "success") {
$time = (get-date)
$worked = ($worked + 1) 
if ($didnt -gt "0") {
$failrate = ( ($didnt / $worked ) * 100).tostring(".0")
write-output `r"ping successful $target - $time - $failrate% loss - $ms ms                     " | out-string -stream | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()} 
write-output `r"ping successful $target - $time - $failrate% loss - $ms ms                     " | out-file -append "c:\$logfoldername\$target.pingchecker.log"
}
else {
write-output `r"ping successful $target - $time - 0% loss - $ms ms " | out-string -stream | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()} 
write-output `r"ping successful $target - $time - 0% loss - $ms ms " | out-file -append "c:\$logfoldername\$target.pingchecker.log"
}
}
else {
$time = (get-date)
$didnt = ($didnt + 1)
if ($worked -gt "0") {
$failrate = ( ($didnt / $worked ) * 100).tostring(".0")
            $errormessage = "ping failed - $ip - $time - $failrate% loss ($didnt lost)                    "
write-output "                 " 
            $errormessage | out-string -stream | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()} 
write-output "                 " | out-file -append "c:\$logfoldername\$target.pingchecker.log" 
}
else {
$didnt = ($didnt - 1)
write-output `r"$ip - $time - host not sucessfully pinged yet. " | out-string -stream | foreach-object {
    $cmdoutput.lines = $cmdoutput.lines + $_
    $cmdoutput.select($cmdoutput.text.length, 0)
    $cmdoutput.scrolltocaret()
    $mainform.update()} 
write-output `r"$ip - $time - host not sucessfully pinged yet. " | out-file -append "c:\$logfoldername\$target.pingchecker.log"
}
}
sleep -milliseconds 500

}
writecomplete
} #end of ping function


#end of function initializing


$cmdoutput_textchanged={
#todo: place custom script here

}

$startpingbutton_click={
#todo: place custom script here
start-job $job1
}

$viewlogsbutton_click={
browsefolder
}

$logfolderapply_click={
#todo: place custom script here
$logfoldername=$logfoldernametext.text
$parameters['b'] =$logfoldernametext.text
$parameters | export-clixml -path "c:\$foldername\$configname"
[system.reflection.assembly]::loadwithpartialname(“system.windows.forms”)
[windows.forms.messagebox]::show(“you have changed default location pingchekcer logs. logs saved in $logfoldername.”, 
“logs saved in new location!”, [windows.forms.messageboxbuttons]::ok, [windows.forms.messageboxicon]::information)

}

$logfoldernametext_textchanged={
#todo: place custom script here

}

$buttonbrowsefolder_click={
if($folderbrowserdialog.showdialog() -eq 'ok')
{
$logfoldernametext.text = $folderbrowserdialog.selectedpath

}
}

$stopping_click={
#todo: place custom script here
$target=$textboxfind.text #we're taking text input box variable $serverinfo
$duration=0
[system.reflection.assembly]::loadwithpartialname(“system.windows.forms”)
[windows.forms.messagebox]::show(“pinging of $target have been cancelled or terminated.”, 
“ping-job terminated!”, [windows.forms.messageboxbuttons]::ok, [windows.forms.messageboxicon]::information)
$cmdoutput.text=""
$textboxtime.text=""
$textboxfind.text=""
}

$labelexit_click={
#todo: place custom script here
[environment]::exit(0)
}


best regards thomas mortsell

you'll want @ runspaces this.  here's article boe prox on subject

http://learn-powershell.net/2012/10/14/powershell-and-wpf-writing-data-to-a-ui-from-a-different-runspace/

i'm not going to go through code posted here think this, if display initiating job can data when receives job.  if job designed write data window should able it.  see difference between 2 approaches? 


hope helps! jason



Windows Server  >  Windows PowerShell



Comments

Popular posts from this blog

Error: 0x80073701 when trying to add Print Services Role in Windows 2012 Standard

Disconnecting from a Windows Server 2012 R2 file sharing session on a Windows 7,8,10 machine

Windows 2016 RDS event 1306 Connection Broker Client failed to redirect the user... Error: NULL