Você está se deparando com duas surpresas diferentes do PowerShell.
Primeiro: escopo. Quando você altera uma variável dentro de seu manipulador de eventos, você está apenas definindo uma nova variável que existe somente dentro desse bloco. Como um caso de teste simples, digitar isso no console produz 1 :
$a = 1; {$a = 2}.Invoke(); $a
Para especificar que você está atribuindo ao escopo global, anexe o global: ao nome da variável. Isso imprime 2 :
$a = 1; {$global:a = 2}.Invoke(); $a
Segundo: redirecionamento de saída de evento. Quando você produz resultados de um manipulador de eventos, ele é salvo em um objeto de trabalho. Para imprimir no console, use Write-Host em vez de (o implícito) Write-Output . Por exemplo:
Write-Host $lasttimefilecreated
Você pode considerar usar um temporizador em vez de um loop, da seguinte forma:
$timer = New-Object System.Timers.Timer
$timer.Interval = 5000
$timer.Enabled = $true
Register-ObjectEvent $timer 'Elapsed' -Action {
If ($global:logflag -eq 0) {
$global:logflag = 1
Add-content "C:\Log.txt" -value "$(Get-Date)"
Write-Host "Log.txt file created/modified at $(Get-Date)"
}
}
$timer.AutoReset = $true
$timer.Start()
while ($true) {Start-Sleep -Seconds 5}
O loop final impede que o script seja encerrado. Os timers continuariam a funcionar se parassem, mas parece um pouco estranho.