Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 基于时间的while循环_Powershell - Fatal编程技术网

Powershell 基于时间的while循环

Powershell 基于时间的while循环,powershell,Powershell,我一直试图让while&If循环正确地读入时间,但它并没有在正确的时间到达时结束程序。我试着使用单引号和双引号,以及不同的语法,比如(-eq,-match,-ne)来看看它们是否有效……但它们没有 计划目标:循环直到早上7:00 此条件应能完成以下工作: if((获取日期)-gt(获取日期-小时7分钟0秒0)){ #While循环结束条件 $value=2 #更多行动 } 它将当前时间与当前日期的DateTime对象进行比较,但时间设置为07:00:00 记住两件事: 它只允许环路在午夜和早上

我一直试图让while&If循环正确地读入时间,但它并没有在正确的时间到达时结束程序。我试着使用单引号和双引号,以及不同的语法,比如(
-eq
-match
-ne
)来看看它们是否有效……但它们没有

计划目标:循环直到早上7:00
此条件应能完成以下工作:

if((获取日期)-gt(获取日期-小时7分钟0秒0)){
#While循环结束条件
$value=2
#更多行动
}
它将当前时间与当前日期的
DateTime
对象进行比较,但时间设置为
07:00:00

记住两件事:

  • 它只允许环路在午夜和早上7点之间运行。如果要在需要调整条件的前一天启动脚本

  • 如果,则不使用
    ,而是将条件直接放入
    while()
    ,这样可能更具可读性:

  • while((获取日期)-lt(获取日期-小时7分钟0秒0)){
    #做点什么
    }
    

    目前,您正在检查确切的时间,因此理论上可能满足结束条件,但是,如果它在前/后一秒到达该特定行,它将不会停止循环。

    此条件应能完成以下工作:

    if((获取日期)-gt(获取日期-小时7分钟0秒0)){
    #While循环结束条件
    $value=2
    #更多行动
    }
    
    它将当前时间与当前日期的
    DateTime
    对象进行比较,但时间设置为
    07:00:00

    记住两件事:

  • 它只允许环路在午夜和早上7点之间运行。如果要在需要调整条件的前一天启动脚本

  • 如果,则不使用
    ,而是将条件直接放入
    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