How do I pass events to a background job in PowerShell
I have a piece of powershell which launches a background job which contains a file watcher- the main script continues to start an exe and wait for it to finish. While the exe is working, if it touches the watched file, the background job springs to life and does some other processing on that file, then carries on waiting. When the script ends, it stops and removes the background job. My worry is, will this clean up the file watcher correctly? Is there a way I can have the parent script raise an event that the background job waits for and triggers that job to shut down?
I've tried this- Parent script:
start-job -name "start-esinput-watcher" -FilePath ".input-watcher.ps1"
$process= "notepad.exe"
Start-Process -filepath $process -Wait
#Create the new event again so it gets caught by the subscription
New-Event -SourceIdentifier StartES.Stopping -Sender PowerShell.StartES -MessageData "stop" #| Out-Null
Watcher script:
try {
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "d:temp"
$watcher.Filter = "somefile.txt"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
$action = {
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) es_input.cfg file change detected"
}
}
catch {
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Error $($_.Exception.Message)"
}
Register-ObjectEvent $watcher Changed -Action $action -SourceIdentifier "ESINPUTCFG_WATCHER"
while ($true) {
$lastEv = get-event | where { $_.SourceIdentifier -eq "StartES.Stopping" } | Select -Last 1
if ($lastEv -eq $null) {
Start-Sleep 1
}
else {
break
}
}
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Unregistering events and watcher"
Unregister-Event -SourceIdentifier "ESINPUTCFG_WATCHER"
$watcher.Dispose()
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Fin"
The script never seems to end, logging anything after the while loop. I did have (in the watcher script) an Register-EngineEvent with an action to set a global var to $Global:shouldRun = $false and used that for the while loop, but this also seemed to do nothing. What am I missing?
windows powershell events parallel-processing
add a comment |
I have a piece of powershell which launches a background job which contains a file watcher- the main script continues to start an exe and wait for it to finish. While the exe is working, if it touches the watched file, the background job springs to life and does some other processing on that file, then carries on waiting. When the script ends, it stops and removes the background job. My worry is, will this clean up the file watcher correctly? Is there a way I can have the parent script raise an event that the background job waits for and triggers that job to shut down?
I've tried this- Parent script:
start-job -name "start-esinput-watcher" -FilePath ".input-watcher.ps1"
$process= "notepad.exe"
Start-Process -filepath $process -Wait
#Create the new event again so it gets caught by the subscription
New-Event -SourceIdentifier StartES.Stopping -Sender PowerShell.StartES -MessageData "stop" #| Out-Null
Watcher script:
try {
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "d:temp"
$watcher.Filter = "somefile.txt"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
$action = {
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) es_input.cfg file change detected"
}
}
catch {
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Error $($_.Exception.Message)"
}
Register-ObjectEvent $watcher Changed -Action $action -SourceIdentifier "ESINPUTCFG_WATCHER"
while ($true) {
$lastEv = get-event | where { $_.SourceIdentifier -eq "StartES.Stopping" } | Select -Last 1
if ($lastEv -eq $null) {
Start-Sleep 1
}
else {
break
}
}
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Unregistering events and watcher"
Unregister-Event -SourceIdentifier "ESINPUTCFG_WATCHER"
$watcher.Dispose()
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Fin"
The script never seems to end, logging anything after the while loop. I did have (in the watcher script) an Register-EngineEvent with an action to set a global var to $Global:shouldRun = $false and used that for the while loop, but this also seemed to do nothing. What am I missing?
windows powershell events parallel-processing
add a comment |
I have a piece of powershell which launches a background job which contains a file watcher- the main script continues to start an exe and wait for it to finish. While the exe is working, if it touches the watched file, the background job springs to life and does some other processing on that file, then carries on waiting. When the script ends, it stops and removes the background job. My worry is, will this clean up the file watcher correctly? Is there a way I can have the parent script raise an event that the background job waits for and triggers that job to shut down?
I've tried this- Parent script:
start-job -name "start-esinput-watcher" -FilePath ".input-watcher.ps1"
$process= "notepad.exe"
Start-Process -filepath $process -Wait
#Create the new event again so it gets caught by the subscription
New-Event -SourceIdentifier StartES.Stopping -Sender PowerShell.StartES -MessageData "stop" #| Out-Null
Watcher script:
try {
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "d:temp"
$watcher.Filter = "somefile.txt"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
$action = {
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) es_input.cfg file change detected"
}
}
catch {
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Error $($_.Exception.Message)"
}
Register-ObjectEvent $watcher Changed -Action $action -SourceIdentifier "ESINPUTCFG_WATCHER"
while ($true) {
$lastEv = get-event | where { $_.SourceIdentifier -eq "StartES.Stopping" } | Select -Last 1
if ($lastEv -eq $null) {
Start-Sleep 1
}
else {
break
}
}
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Unregistering events and watcher"
Unregister-Event -SourceIdentifier "ESINPUTCFG_WATCHER"
$watcher.Dispose()
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Fin"
The script never seems to end, logging anything after the while loop. I did have (in the watcher script) an Register-EngineEvent with an action to set a global var to $Global:shouldRun = $false and used that for the while loop, but this also seemed to do nothing. What am I missing?
windows powershell events parallel-processing
I have a piece of powershell which launches a background job which contains a file watcher- the main script continues to start an exe and wait for it to finish. While the exe is working, if it touches the watched file, the background job springs to life and does some other processing on that file, then carries on waiting. When the script ends, it stops and removes the background job. My worry is, will this clean up the file watcher correctly? Is there a way I can have the parent script raise an event that the background job waits for and triggers that job to shut down?
I've tried this- Parent script:
start-job -name "start-esinput-watcher" -FilePath ".input-watcher.ps1"
$process= "notepad.exe"
Start-Process -filepath $process -Wait
#Create the new event again so it gets caught by the subscription
New-Event -SourceIdentifier StartES.Stopping -Sender PowerShell.StartES -MessageData "stop" #| Out-Null
Watcher script:
try {
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "d:temp"
$watcher.Filter = "somefile.txt"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
$action = {
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) es_input.cfg file change detected"
}
}
catch {
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Error $($_.Exception.Message)"
}
Register-ObjectEvent $watcher Changed -Action $action -SourceIdentifier "ESINPUTCFG_WATCHER"
while ($true) {
$lastEv = get-event | where { $_.SourceIdentifier -eq "StartES.Stopping" } | Select -Last 1
if ($lastEv -eq $null) {
Start-Sleep 1
}
else {
break
}
}
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Unregistering events and watcher"
Unregister-Event -SourceIdentifier "ESINPUTCFG_WATCHER"
$watcher.Dispose()
Add-Content d:tempinput-watcher.log "$([DateTime]::Now.ToString()) Fin"
The script never seems to end, logging anything after the while loop. I did have (in the watcher script) an Register-EngineEvent with an action to set a global var to $Global:shouldRun = $false and used that for the while loop, but this also seemed to do nothing. What am I missing?
windows powershell events parallel-processing
windows powershell events parallel-processing
asked Feb 6 at 16:26
ShawsonShawson
1013
1013
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "3"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1402750%2fhow-do-i-pass-events-to-a-background-job-in-powershell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Super User!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1402750%2fhow-do-i-pass-events-to-a-background-job-in-powershell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown