在Register-ObjectEvent操作块中修改变量

时间:2019-05-20 18:01:31

标签: powershell

我正在连接到Microsoft Graph,以获得一些报告。但是,如果报告接近一个小时,我想自动重新请求令牌。我可以使脚本在Visual Studio Code中工作,但它不会在常规shell中更新令牌或TimeoutTimer变量。我希望能够将其作为计划任务运行,因为运行时间约为8小时。

我假设这是由于范围界定,但我希望Global可以工作,除非不是。我也尝试过使用$ job.Module.SessionState.PSVariable.Set()设置“状态”变量,但无法使其正常工作(不是很熟悉,所以我做了一些其他事情)看到环顾四周。

    $Global:TimeoutTimer = New-Object timers.timer

    $Global:token = "none"

    $TimerAction = { 
        $Global:tokenRequest = Connect-MicrosoftGraphCustom "Secret Parameters"
        $Global:token = $Global:tokenRequest.access_token
        $Global:TimeoutTimer.Interval = ($Global:tokenRequest.expires_in * 1000) - 100000 
        Write-Host "Inside action: $($Global:TimeoutTimer.Interval)" -ForegroundColor Green
    }

    $job = Register-ObjectEvent -InputObject $Global:TimeoutTimer -EventName Elapsed -Action $TimerAction 
    $Global:TimeoutTimer.Enabled = $true

    sleep -Milliseconds 100

    $i = 0
    while ($i -le 5)
    {
        Write-host "Function Return: $($token)" -ForegroundColor Red
        Write-Host "Global Variable: $($Global:Token)" -ForegroundColor Gray
        Write-Host "Timer Expires in: $($TimeoutTimer.interval) or $($Global:TimeoutTimer.interval)" -ForegroundColor Blue
        sleep 3600
        $i++
    }

    $Global:timeoutTimer.Enabled = $false

我希望得到一些“内部动作:x”输出,然后在循环过程中得到一些令牌副本。我在shell中得到的只是一堆“无”和“计时器在100或100中到期”

我该如何做才能在每次访问令牌变量时都在不读取文件的情况下在适当的范围内更新令牌的值?

1 个答案:

答案 0 :(得分:1)

下面是一个如何更改变量(甚至是非全局变量)的示例。这个想法是通过使用GetNewClosure创建闭包,并将令牌放入另一个对象(在我的情况下,它是哈希表):

$timer = New-Object System.Timers.Timer(1000)

$tokenObj = @{}

$sb = {
    $random = New-Object System.Random
    $tokenObj['token'] = $random.Next(100)
}.GetNewClosure()

Register-ObjectEvent -InputObject $timer -EventName 'Elapsed' -Action $sb

$timer.Start()

for ($i = 0; $i -lt 20; $i++)
{
    Write-Host "Token value: $($tokenObj['token'])"
    Start-Sleep -Milliseconds 400
}
相关问题