It looks like this:
Code: Select all
$script:pingtimer = New-Object System.Windows.Forms.Timer
$script:pingtimer.Enabled = $true
$pingtimer.Interval = 10000
$pingtimer.Add_Tick({
if ($pc -eq $env:COMPUTERNAME)
{
$panel_online.BackColor = 'GreenYellow'
$labelStatusPCOnOff.Text = "LOCALHOST"
$script:statusTargetPc = $true
}
elseif (!($pc))
{
$panel_online.BackColor = 'Red'
$labelStatusPCOnOff.Text = "NO TARGET"
$script:statusTargetPc = $false
}
else
{
Add-JobTracker -Name "ping" -JobScript { `
param ($pc)
$a = Test-Connection -ComputerName $pc -Quiet -Count 1
return $a
} -CompletedScript { `
$ping = Receive-Job -Name "ping"
if ($ping)
{
$panel_online.BackColor = 'GreenYellow'
$labelStatusPCOnOff.Text = "ONLINE"
$script:statusTargetPc = $true
}
else
{
$panel_online.BackColor = 'Red'
$labelStatusPCOnOff.Text = "OFFLINE"
$script:statusTargetPc = $false
}
} -ArgumentList $pc
}
})
$script:pingtimer.Start()
Problems start to appear when I run a different job function that I use to scan a remote computer for specific changes (software metering), to be specific, the problem occurs when this job finishes its "scriptblock" part and jumps to "completedscript" part. This part looks like this:
Code: Select all
-CompletedScript {
#get job results
Param ($Job)
$script:scanafter = Receive-Job -Job $Job -Keep
Add-Log -Color 'Red' -Value "COMPARE SCAN COMPLETE, GENERATING RESULTS..." -NewLine
Show-NotifyIcon -BalloonTipTitle "PCT" -BalloonTipText "COMPARE SCAN COMPLETE" -BalloonTipIcon 'Info' -NotifyIcon $notifyicon_PCT
#compare scans and show differences
$script:compareafter = [ordered]@{ }
$compareafter.apps = compare $scanbefore.apps $scanafter.apps -Property ProgramName, DisplayVersion -PassThru | ? { $_.Sideindicator -eq "=>" }
$compareafter.appfolders = compare $scanbefore.appfolders $scanafter.appfolders -Property FullName -PassThru | ? { $_.Sideindicator -eq "=>" }
$compareafter.filteredappfolders = @()
$previous = $null
$compareafter.appfolders.fullname | foreach {
if (($previous -eq $null) -or ($_ -notlike "$previous*"))
{
$previous = $_
$compareafter.filteredappfolders += "$_"
}
}
Clear-Variable previous
$compareafter.exefiles = compare $scanbefore.exefiles $scanafter.exefiles -Property FullName -PassThru | ? { $_.Sideindicator -eq "=>" }
$compareafter.registry = compare $scanbefore.registry $scanafter.registry | ? { $_.Sideindicator -eq "=>" }
$compareafter.drivers = compare $scanbefore.drivers $scanafter.drivers -Property OriginalFileName, Version -PassThru | ? { $_.Sideindicator -eq "=>" }
$compareafter.services = compare $scanbefore.services $scanafter.services -Property Name, DisplayName -PassThru | ? { $_.Sideindicator -eq "=>" }
$compareafter.tasks = compare $scanbefore.tasks $scanafter.tasks -Property TaskName, TaskPath, Description | ? { $_.Sideindicator -eq "=>" }
$compareafter.envvar = compare $scanbefore.envvar $scanafter.envvar -Property Name, Value | ? { $_.Sideindicator -eq "=>" }
$compareafter.startmenu = compare $scanbefore.startmenu $scanafter.startmenu -Property FullName | ? { $_.Sideindicator -eq "=>" }
<#
#save dialog
$SaveCompareDialog = New-Object System.Windows.Forms.SaveFileDialog
$SaveCompareDialog.Title = "Save Compare Results"
$SaveCompareDialog.initialDirectory = "$env:LOCALAPPDATA\PCT"
$SaveCompareDialog.FileName = $PackageFullName + "_AppScan"
$SaveCompareDialog.filter = “Text files (*.txt)|*.txt”
$DialogResult = $SaveCompareDialog.ShowDialog()
if ($DialogResult -eq [System.Windows.Forms.DialogResult]::OK)
{ }
#>
#format data and output to a file
$savefilepath = "$env:LOCALAPPDATA\PCT\AppScan.txt" #$SaveCompareDialog.FileName
Remove-Item -Path $savefilepath -Force -ea 'SilentlyContinue'
New-Item $savefilepath -ItemType File -Force | Add-Content -value "METERING DIFFERENCES:`r`r" -Encoding Unicode
$compareafter.apps | select ProgramName, DisplayVersion, Publisher, InstallDate, UninstallString | ft | Out-String | Out-File $savefilepath -Append -Force
#$compareafter.appfolders | select @{ Name = "AppFolders"; Expression = "FullName" } | Out-String | Out-File $SaveCompareDialog.filename -Append -Force
if ($compareafter.filteredappfolders) { Add-Content $savefilepath -Value "Application Folders:`n--------------------`r" }
$compareafter.filteredappfolders | Out-File $savefilepath -Append -Force
$compareafter.exefiles | select @{ Name = "ExeFiles"; Expression = "FullName" } | Out-String | Out-File $savefilepath -Append -Force
$compareafter.registry | select @{ Name = "Registry"; Expression = "InputObject" } | Out-String | Out-File $savefilepath -Append -Force
$compareafter.drivers | select @{ Name = "Driver"; Expression = "OriginalFileName" }, @{ Name = "Description"; Expression = "ClassDescription" }, Version, ProviderName | ft -Wrap | Out-String | Out-File $savefilepath -Append -Force
$compareafter.services | select @{ Name = "Service"; Expression = "Name" }, @{ Name = "Service Display Name"; Expression = "DisplayName" }, Status | ? { $_.Service -ne "PSEXESVC" } | ft -Wrap | Out-String | Out-File $savefilepath -Append -Force
$compareafter.tasks | select TaskName, TaskPath, Description | ft -Wrap | Out-String | Out-File $savefilepath -Append -Force
$compareafter.envvar | select @{ Name = "Environment Variables"; Expression = "Name" }, Value | ft -Wrap | Out-String | Out-File $savefilepath -Append -Force
$compareafter.startmenu | select @{ Name = "Start Menu"; Expression = "FullName" } | Out-String | Out-File $savefilepath -Append -Force
ii $savefilepath
$exportcompare = show-messagebox -YesNo -M "Do you want to export compare results to Exchange?" -TM -Q -T "Export Compare Results"
if ($exportcompare -eq "Yes")
{
if (!(Test-Path "$exchange\MeteringFiles\$PackageFullName")) { New-Item -ItemType directory -Path "$exchange\MeteringFiles" -Name $PackageFullName }
Copy-Item $savefilepath "$exchange\MeteringFiles\$PackageFullName" -Force
$exeprops = foreach ($i in $compareafter.exefiles.fullname) { icm -cn $pc -ScriptBlock { param ($exe) Get-ItemProperty $exe } -ArgumentList $i }
$exeprops | ConvertTo-Csv | Out-File "$exchange\MeteringFiles\$PackageFullName\$PackageFullName.$PackageVersion EXE.csv" -Force
}
$toolstrip_Progressbar2.Style = 'Blocks'
$toolstrip_Progressbar2.Value = 0
$toolstrip_Status.Text = "Idle"
} -ArgumentList ($pc)
If I remove the pingtimer job, other jobs works just fine.
The Output console is showing this:
Code: Select all
ERROR: Exception calling "RemoveAt" with "1" argument(s): "Index je mimo rozsah. Index musí být nezáporný a musí být menší než velikost kolekce.
ERROR: Název parametru: index"
Globals.ps1 (448): ERROR: At Line: 448 char: 6
ERROR: + $JobTrackerList.RemoveAt($index)
ERROR: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ERROR: + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
ERROR: + FullyQualifiedErrorId : ArgumentOutOfRangeException
ERROR:
ERROR: Remove-Job : The command cannot remove the job because it does not exist or because it is a child job. Child jobs can be removed only by removing the parent jo
ERROR: b.
Globals.ps1 (449): ERROR: At Line: 449 char: 6
ERROR: + Remove-Job -Job $psObject.Job
ERROR: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ERROR: + CategoryInfo : InvalidOperation: (System.Manageme...n.PSRemotingJob:PSRemotingJob) [Remove-Job], ArgumentException
ERROR: + FullyQualifiedErrorId : CannotRemoveJob,Microsoft.PowerShell.Commands.RemoveJobCommand
ERROR:
Thanks a lot,
Thomas