我一直在Windows 8.1上的PowerShell V4中编写脚本,该脚本使用后台进程和事件。我发现了一些有点奇怪的东西。而不是发布我的脚本的2,500行左右,我已经包含了一个更短的程序,它表现出奇怪的行为。我希望这是我做错了但我看不出问题是什么。代码如下:
`
# Scriptblocks to simulate the background task and the action to
# take when an event is raised
[scriptblock] $MyScript = {
for ($i = 0;$i -lt 30;$i++)
{
[console]::writeline("This is a test - $i")
start-sleep -m 500
}
}
[scriptblock] $StateChanged = {
[console]::writeline("The state changed")
}
# Create a runspace pool
$RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, [int] $env:NUMBER_OF_PROCESSORS + 1)
$RunspacePool.ApartmentState = "MTA"
$RunspacePool.Open()
# Create and start the background task to run
$PS = [powershell]::Create()
[void] $PS.AddScript($MyScript)
$PS.RunspacePool = $RunspacePool
$Asyncresult = $PS.BeginInvoke()
# Register an interest in the InvocationStateChanged event for
# the background task. Should the event happen (which it will)
# run the $StateChanged scriptblock
Register-ObjectEvent -InputObject $PS -EventName InvocationStateChanged -Action $StateChanged
# The loop that simulates the main purpose of the script
[int] $j = 0
while ($PS.InvocationStateInfo.State -eq [System.Management.Automation.PSInvocationState]::Running)
{
if ($j -eq 2)
{
[void] $PS.BeginStop($NULL, $NULL)
}
"Running: $j" | out-host
sleep -m 400
$j = $j + 1
}
sleep 10
`
基本上它所做的只是创建一个运行空间来运行一个PowerShell脚本块,而在运行它时会在前台运行其他东西。我模拟某人按下按钮,或者,无论出于何种原因,正在执行的beginstop方法停止后台进程。一切正常,后台进程正式停止。但是,我已经为后台powershell脚本注册了一个事件,该脚本在后台作业更改状态时运行脚本块。奇怪的是,脚本块被调用两次,我无法解决原因。
以下是运行脚本的一些输出:
E:\Test Programs>powershell -file .\strange.ps1
This is a test - 0
Running: 0
This is a test - 1
Running: 1
The state changed
Running: 2
The state changed
E:\Test Programs>
正如你所看到的那样显示"状态发生变化"两次。它们相距不到一秒。我在最后添加sleep 10
以消除脚本停止导致第二个"状态改变"的可能性。消息。
如果有人能解释什么是错的,我将非常感激。
答案 0 :(得分:0)
InvocationStateChanged
和Running
上的Completed
事件很可能被调用
如果您将$StateChanged
更改为还包括$Sender.InvocationStateInfo.State
自动变量属性,如下所示:
[scriptblock] $StateChanged = {
[console]::writeline("The state changed to: $($Sender.InvocationStateInfo.State)")
}
您的输出可能看起来像:
This is a test - 0
Running: 0
This is a test - 1
Running: 1
The state changed to: Running
Running: 2
The state changed: Completed
答案 1 :(得分:0)
我很抱歉一年半前没有按照我应该做的那样回复。出于某种原因,我从来没有收到过有答案的通知,老实说,我只是忘记检查了。
无论如何,谢谢你的回答。我仍然有我的小测试脚本,虽然我实际写的东西已经被转储和重写,但我确实检查了我的小测试脚本,我得到的是:
Running: 0
Running: 1
This is a test - 1
The state changed to: Stopped
The state changed to: Stopped
Running: 2
现在支持 Windows 10。
好吧,还是谢谢你的建议。正如我所说,我已经重写了原始脚本,所以现在只是为了兴趣。
最好的祝福...... 科林