powershell - 在PowerShell中,如何创建一个在启动时仅运行1次然后自行删除的计划任务?

标签 powershell scheduled-tasks windows-11 powershell-core powershell-7.3

这是我迄今为止收集到的。我需要一个仅运行一次的计划任务,在下次启动时(无论何时),并且在运行后它应该删除自身。

Register-ScheduledTask -TaskName "Test 1" -InputObject (
    (
        New-ScheduledTask -Action (
            New-ScheduledTaskAction -Execute "PowerShell.exe"
        ) -Trigger (
            New-ScheduledTaskTrigger -Once -AtStartup # both of these can't be used
        ) -Settings (
            New-ScheduledTaskSettingsSet -DeleteExpiredTaskAfter 00:00:01 
        ) 
    ) | ForEach-Object { $_.Triggers[0].EndBoundary = <# 1 second after task is run #> ; $_ }
)

我不确定是否可能,如果不可能,请告诉我,以便我探索其他选项,但如果可以,我需要帮助弄清楚如何实现它。 EndBoundary 看起来需要一个日期,但我没有任何日期,因为不知道下一次启动的时间。

我这样做是因为我需要在下次启动时(时间未知)运行 PowerShell 代码,并且仅运行 1 次。

最佳答案

-Once 仅适用于基于日历的触发器,例如“每月”、“每周”等。您不能将其与 -AtStartup 结合使用,以便它仅针对一个启动运行。

-DeleteExpiredTaskAfter 仅适用于到期日期。但到期日期不适用于 -AtStartup,因为任务可能会在计算机启动之前到期。

执行后自行删除任务的一个简单方法是将删除添加到您正在执行的 PowerShell 脚本中。只需将以下行添加到您的 PowerShell 脚本中:

Unregister-ScheduledTask -TaskName 'Test 1' -Confirm:$false

您也可以禁用它,以便它不再运行,但您可以获得有关它何时运行以及结果是什么的信息:

Disable-ScheduledTask -TaskName 'Test 1'

如果您不想修改主要操作,您还可以添加第二个操作,其定义如下:

New-ScheduledTaskAction -Execute powershell -Argument "-Command `"Unregister-ScheduledTask -TaskName 'Test 1' -Confirm:`$false`""

总的来说,您的任务定义可能如下所示:

Register-ScheduledTask -TaskName "Test 1" -InputObject (
    (
        New-ScheduledTask -Action (
            (New-ScheduledTaskAction -Execute "PowerShell.exe"),
            (New-ScheduledTaskAction -Execute powershell -Argument "-ExecutionPolicy ByPass -Command `"Unregister-ScheduledTask -TaskName 'Test 1' -Confirm:`$false`"")
        ) -Trigger (
            New-ScheduledTaskTrigger -AtStartup
        )
    )
)

关于powershell - 在PowerShell中,如何创建一个在启动时仅运行1次然后自行删除的计划任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76368440/

相关文章:

powershell - 为什么 `Install-Module` 不遵守脚本范围内的 $ErrorActionPreference=Stop ?

powershell - 通过 GPO 的 Ansible Winrm HTTPS 监听器配置

powershell - 使用另一个脚本中定义的枚举

c# - 如何使用 taskschd.dll 库从任务计划程序中查找所有正在运行和就绪的任务

java - 获取@Scheduled内的fixedDelay值

php - PHP中计划任务的最佳方法是什么

windows - 将 powershell 的输出保存在 CSV 文件中

powershell - 如果尚未启用 VLAN,请启用 VLAN 并使用 powershell 脚本设置 VLAN ID

javascript - 通过 Javascript 检测 Windows 11

.net - Windows 11 上是否预装了 .NET Framework 4.8