Powershell 基于时间的while循环
我一直试图让while&If循环正确地读入时间,但它并没有在正确的时间到达时结束程序。我试着使用单引号和双引号,以及不同的语法,比如(Powershell 基于时间的while循环,powershell,Powershell,我一直试图让while&If循环正确地读入时间,但它并没有在正确的时间到达时结束程序。我试着使用单引号和双引号,以及不同的语法,比如(-eq,-match,-ne)来看看它们是否有效……但它们没有 计划目标:循环直到早上7:00 此条件应能完成以下工作: if((获取日期)-gt(获取日期-小时7分钟0秒0)){ #While循环结束条件 $value=2 #更多行动 } 它将当前时间与当前日期的DateTime对象进行比较,但时间设置为07:00:00 记住两件事: 它只允许环路在午夜和早上
-eq
,-match
,-ne
)来看看它们是否有效……但它们没有
计划目标:循环直到早上7:00
此条件应能完成以下工作:
if((获取日期)-gt(获取日期-小时7分钟0秒0)){
#While循环结束条件
$value=2
#更多行动
}
它将当前时间与当前日期的DateTime
对象进行比较,但时间设置为07:00:00
记住两件事:
,而是将条件直接放入while()
,这样可能更具可读性:
while((获取日期)-lt(获取日期-小时7分钟0秒0)){
#做点什么
}
目前,您正在检查确切的时间,因此理论上可能满足结束条件,但是,如果它在前/后一秒到达该特定行,它将不会停止循环。此条件应能完成以下工作:
if((获取日期)-gt(获取日期-小时7分钟0秒0)){
#While循环结束条件
$value=2
#更多行动
}
它将当前时间与当前日期的DateTime
对象进行比较,但时间设置为07:00:00
记住两件事:
,而是将条件直接放入while()
,这样可能更具可读性:
while((获取日期)-lt(获取日期-小时7分钟0秒0)){
#做点什么
}
目前,您正在检查确切的时间,因此理论上可能会满足结束条件,但是,如果它在前/后一秒到达该特定行,它将不会停止循环。if语句变为真的可能性非常低。因为您的while循环至少需要8秒(2倍的开始睡眠和其他工作)才能开始新的循环。这意味着$time变量可能永远不会精确到02:03:00。在这种情况下,我不会去的确切时间。相反,我会检查是02:03:00还是更晚。试试看:
$time = Get-Date
if ($time -ge (Get-Date -Hour 02 -Minute 03 -Second 00))
{
}
你的if陈述变为真实的可能性很低。因为您的while循环至少需要8秒(2倍的开始睡眠和其他工作)才能开始新的循环。这意味着$time变量可能永远不会精确到02:03:00。在这种情况下,我不会去的确切时间。相反,我会检查是02:03:00还是更晚。试试看:
$time = Get-Date
if ($time -ge (Get-Date -Hour 02 -Minute 03 -Second 00))
{
}
完成的代码(至少是这个版本的代码)。谢谢你的帮助:)
#创建一个弹出窗口,防止计算机超时;每15分钟一次。
$wshell=新对象-ComObject Wscript.Shell
#获取24小时格式的时间
$time=获取日期
#而该值不等于2。
而($value-ne 2)
{
#值应为1以保持在循环中。
$value=1
$wshell.Popup(“操作完成”,5,“完成”,1)
#使程序等待发送回车键。
睡眠2
#如果条件;如果时间超过上午7点,则程序退出。
if((获取日期)-gt(获取日期-小时7-分钟0-秒0))
{
#While循环结束条件
$value=2
}
其他的
{
#While循环条件
$value=1
#使程序等待(900秒=15分钟)以防止电脑超时,睡眠后将重新运行。
睡900
}
}
#清除COM对象
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wshell)| Out Null
完成的代码(无论如何至少是这个版本)。谢谢你的帮助:)
#创建一个弹出窗口,防止计算机超时;每15分钟一次。
$wshell=新对象-ComObject Wscript.Shell
#获取24小时格式的时间
$time=获取日期
#而该值不等于2。
而($value-ne 2)
{
#值应为1以保持在循环中。
$value=1
$wshell.Popup(“操作完成”,5,“完成”,1)
#使程序等待发送回车键。
睡眠2
#如果条件;如果时间超过上午7点,则程序退出。
if((获取日期)-gt(获取日期-小时7-分钟0-秒0))
{
#While循环结束条件
$value=2
}
其他的
{
#While循环条件
$value=1
#使程序等待(900秒=15分钟)以防止电脑超时,睡眠后将重新运行。
睡900
}
}
#清除COM对象
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wshell)| Out Null
As aside:在循环中不断创建一个新的Com对象,而在它完成弹出操作后,从未尝试将其从内存中释放。这最终会耗尽计算机内存。在进入循环之前创建$wshell=New Object-ComObject Wscript.Shell
,然后使用[System.Runtime.Interopservices.Marshal]进行清理::ReleaseComObject($wshell)| Out Null
非常感谢!我总是忘记需要做的事情(习惯了其他语言lol)。我在代码中修复了它。我应该把成品贴在这里吗?这些程序主要是为了防止pc设备在工作时自动锁定(获得了编写脚本的许可)。当然,做我的客人,但也习惯于通过单击✓ 在左边。这将帮助其他有类似问题的人更容易找到它
<###
Program Goal: Prevent PC Timeout/Sleep; also loops until it hits 07:00am
Date: 10/14/19
Version: 1.2
###>
# Creates a Pop-Up Windows that prevents the computer from timing out; runs every 15 minutes.
$wshell = New-Object -ComObject Wscript.Shell
# Get's the time in 24hr format
$time = get-date
# While the value is not equal to 2.
while ($value -ne 2)
{
# Value should be 1 in order to stay in loop.
$value = 1
$wshell.Popup("Operation Completed", 5,"Done", 1)
# Causes the Program to wait to send the Enter Keystroke.
Sleep 2
# If Condition; If the time is over 7am then the program quits.
if ((Get-Date) -gt (Get-Date -Hour 7 -Minute 0 -Second 0))
{
# While Loop End Condition
$value = 2
}
else
{
# While Loop Condition
$value = 1
# Causes the Program to wait (900sec = 15 Minutes) to prevent PC Timeout, will re-run again after Sleep.
Sleep 900
}
}
# Cleans up the COM Object
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wshell) | Out-Null