Created
May 3, 2021 15:19
-
-
Save esmcelroy/34716def129f1158ce5a034d1fe89cad to your computer and use it in GitHub Desktop.
keepalive ps1 file - not mine, but uploaded here for quick reference.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
.Synopsis | |
This is a pecking bird function, a press on the <Ctrl> key will run every 5 minues. | |
.DESCRIPTION | |
This function will run a background job to keep your computer alive. By default a KeyPess of the <Ctrl> key will be pushed every 5 minutes. | |
Please be aware that this is a short term workaround to allow you to complete an otherwise impossible task, such as download a large file. | |
This function should only be run when your computer is locked in a secure location. | |
.EXAMPLE | |
Start-KeepAlive | |
Id Name PSJobTypeName State HasMoreData Location | |
-- ---- ------------- ----- ----------- -------- | |
90 KeepAlive BackgroundJob Running True localhost | |
KeepAlive set to run until 10/01/2012 00:35:03 | |
By default the keepalive will run for 1 hour, with a keypress every 5 minutes. | |
.EXAMPLE | |
Start-KeepAlive -KeepAliveHours 3 | |
Id Name PSJobTypeName State HasMoreData Location | |
-- ---- ------------- ----- ----------- -------- | |
92 KeepAlive BackgroundJob Running True localhost | |
KeepAlive set to run until 10/01/2012 02:36:12 | |
You can specify a longer KeepAlive period using the KeepAlive parameter E.g. specify 3 hours | |
.EXAMPLE | |
Start-KeepAlive -KeepAliveHours 2 -SleepSeconds 600 | |
You can also change the default period between each keypress, here the keypress occurs every 10 minutes (600 Seconds). | |
.EXAMPLE | |
KeepAliveHours -Query | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around 19.96 Minutes | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around 14.96 Minutes | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around 9.96 Minutes | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around 4.96 Minutes | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around -0.04 Minutes | |
KeepAlive has now completed.... job will be cleaned up. | |
KeepAlive has now completed. | |
Run with the Query Switch to get an update on how long the timout will have to run. | |
.EXAMPLE | |
KeepAliveHours -Query | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around 19.96 Minutes | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around 14.96 Minutes | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around 9.96 Minutes | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around 4.96 Minutes | |
Job will run till 09/30/2012 17:20:05 + 5 minutes, around -0.04 Minutes | |
KeepAlive has now completed.... job will be cleaned up. | |
KeepAlive has now completed. | |
The Query switch will also clean up the background job if you run this once the KeepAlive has complete..EXAMPLE | |
.EXAMPLE | |
KeepAliveHours -EndJob | |
KeepAlive has now ended... | |
Run Endjob once you download has complete to stop the Keepalive and remove the background job. | |
.EXAMPLE | |
KeepAliveHours -EndJob | |
KeepAlive has now ended... | |
Run EndJob anytime to stop the KeepAlive and remove the Job. | |
.INPUTS | |
KeepAliveHours - The time the keepalive will be active on the system | |
.INPUTS | |
SleepSeconds - The time between Keypresses. This should be less than the timeout of your computer screensaver or lock screen. | |
.OUTPUTS | |
This cmdlet creates a background job, when you Query the results the status from the background job will be outputed on the screen to let you know how long the KeepAlive will run for. | |
.NOTES | |
General notes | |
.COMPONENT | |
This is a standlone cmdlet, you may change the keystroke to do something more meaningful in a different scenario that this was originally written. | |
.ROLE | |
This utility should only be used in the privacy of your own home or locked office. | |
.FUNCTIONALITY | |
Call this function to enable a temporary KeepAlive for your computer. Allow you to download a large file without sleepin the computer. | |
If the KeepAlive ends and you do not run -Query or -EndJob, then the completed job will remain. | |
You can run Get-Job to view the job. Get-Job -Name KeepAlive | Remove-Job will cleanup the Job. | |
By default you cannot create more than one KeepAlive Job, unless you provide a different JobName. There should be no reason to do this. With Query or EndJob, you can cleanup any old Jobs and then create a new one. | |
#> | |
function Start-KeepAlive { | |
param ( | |
$KeepAliveHours = 1, | |
$SleepSeconds = 300, | |
$JobName = "KeepAlive", | |
[Switch]$EndJob, | |
[Switch]$Query, | |
$KeyToPress = '^' # Default KeyPress is <Ctrl> | |
# Reference for other keys: http://msdn.microsoft.com/en-us/library/office/aa202943(v=office.10).aspx | |
) | |
begin { | |
$Endtime = (Get-Date).AddHours($KeepAliveHours) | |
}#begin | |
process { | |
# Manually end the job and stop the KeepAlive. | |
if ($EndJob) | |
{ | |
if (Get-Job -Name $JobName -ErrorAction SilentlyContinue) | |
{ | |
Stop-Job -Name $JobName | |
Remove-Job -Name $JobName | |
"`n$JobName has now ended..." | |
} | |
else | |
{ | |
"`nNo job $JobName." | |
} | |
} | |
# Query the current status of the KeepAlive job. | |
elseif ($Query) | |
{ | |
try { | |
if ((Get-Job -Name $JobName -ErrorAction Stop).PSEndTime) | |
{ | |
Receive-Job -Name $JobName | |
Remove-Job -Name $JobName | |
"`n$JobName has now completed." | |
} | |
else | |
{ | |
Receive-Job -Name $JobName -Keep | |
} | |
} | |
catch | |
{ | |
Receive-Job -Name $JobName -ErrorAction SilentlyContinue | |
"`n$JobName has ended.." | |
Get-Job -Name $JobName -ErrorAction SilentlyContinue | Remove-Job | |
} | |
} | |
# Start the KeepAlive job. | |
elseif (Get-Job -Name $JobName -ErrorAction SilentlyContinue) | |
{ | |
"`n$JobName already started, please use: Start-Keepalive -Query" | |
} | |
else | |
{ | |
$Job = { | |
param ($Endtime,$SleepSeconds,$JobName,$KeyToPress) | |
"`nStarttime is $(Get-Date)" | |
While ((Get-Date) -le (Get-Date $EndTime)) | |
{ | |
# Wait SleepSeconds to press (This should be less than the screensaver timeout) | |
Start-Sleep -Seconds $SleepSeconds | |
$Remaining = [Math]::Round( ( (Get-Date $Endtime) - (Get-Date) | Select-Object -ExpandProperty TotalMinutes ),2 ) | |
"Job will run till $EndTime + $([Math]::Round( $SleepSeconds/60 ,2 )) minutes, around $Remaining Minutes" | |
# This is the sending of the KeyStroke | |
$x = New-Object -COM WScript.Shell | |
$x.SendKeys($KeyToPress) | |
} | |
try { | |
"`n$JobName has now completed.... job will be cleaned up." | |
# Would be nice if the job could remove itself, below will not work. | |
# Receive-Job -AutoRemoveJob -Force | |
# Still working on a way to automatically remove the job | |
} | |
Catch | |
{ | |
"Something went wrong, manually remove job $JobName" | |
} | |
}#Job | |
$JobProperties =@{ | |
ScriptBlock = $Job | |
Name = $JobName | |
ArgumentList = $Endtime,$SleepSeconds,$JobName,$KeyToPress | |
} | |
Start-Job @JobProperties | |
"`nKeepAlive set to run until $EndTime" | |
} | |
}#Process | |
}#Start-KeepAlive |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment