我创建了一个Powershell脚本,该脚本仅用于分析日志文件,如果最后一行包含关键字“错误”,它将发送电子邮件并运行一个微小的鼠标宏-周期每3秒重复一次-无休止的循环
if ($lastSent -ne $currentLine -and $currentLine -match "Error") {
if ($currentLine -match "Error23") {
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(225, 305)
sleep -Seconds 01
$SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
sleep -Seconds 01
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(60, 305)
sleep -Seconds 01
$SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
sleep -Seconds 01
}
我过去进行过测试,让应用程序运行了好几天,现在还可以运行应用程序和此powershell脚本。
但是,在12h到18h之后,有时甚至一天左右都冻结了计算机,而我无法RDP或ping或其他任何东西,完全冻结了-这是导致它的powershell脚本。
有人可以告诉我任何powershell cmd还是我可以将其添加到清除内存或缓冲区的循环中
谢谢
答案 0 :(得分:0)
如果您没有对该脚本进行任何更改,并且过去运行良好,那么恕我直言,该脚本将不是我的第一个故障排除目标。
环境在您的系统上发生了变化。表示应用程序或主机本身。
您可以强制垃圾回收,这是一种方法……
### Clear resource environment
Function Clear-ResourceEnvironment
{
# Clear any PowerShell sessions created
Get-PSSession | Remove-PSSession
# Release an COM object created
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$Shell)
# Perform garbage collection on session resources
[System.GC]::Collect()
[GC]::Collect()
[GC]::WaitForPendingFinalizers()
# Remove any custom varialbes created
Get-Variable -Name MyShell -ErrorAction SilentlyContinue | Remove-Variable
}
就我个人而言,我真的无法想象为什么选择这种方法,而不是让这个WMI成为永久监视者,或者说要这样做...
实时监控日志...
# Take action as soon as the incoming line equals error
Get-Content -Path .\SomeLogFileName -Wait -Tail 0 |
Where-Object {$_ -match 'error'}
为什么要多次打这个电话?
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(60, 305)
sleep -Seconds 01
$SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
叫这个...
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(60, 305)
...在脚本顶部。
做这个...
sleep -Seconds 01
$SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
sleep -Seconds 01
...一个函数,然后调用该函数与复制代码,就像这样。
Function Send-MouseClick
{
sleep -Seconds 01
$SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
sleep -Seconds 01
}
if ($lastSent -ne $currentLine -and $currentLine -match "Error")
{
if ($currentLine -match "Error23") {
Send-MouseClick
}
我只是想出了一些主意,但显然没有经过检验。