Windows 计划任务 - 带有 cmd 脚本的任务运行,但 .NET 控制台应用程序不运行

Windows 计划任务 - 带有 cmd 脚本的任务运行,但 .NET 控制台应用程序不运行

我正在使用 Powershell 在 Docker 容器中创建 Windows 计划任务。作为测试,我有一个简单的批处理文件,每小时将当前日期/时间写入文本文件一次。这很完美:

RUN $action = New-ScheduledTaskAction -Execute 'C:\folder\task-tester.cmd'; \
    $trigger = New-ScheduledTaskTrigger -Daily -At 12am; \
    $settings = New-ScheduledTaskSettingsSet;  \
    $task = Register-ScheduledTask -TaskName 'Write to text file' -User 'SYSTEM' -Trigger $trigger -Action $action -Settings $settings; \
    $task.Triggers.Repetition.Duration = 'P1D'; \
    $task.Triggers.Repetition.Interval = 'PT1H'; \
    $task | Set-ScheduledTask

当我尝试执行 .NET 控制台应用程序时,它不起作用。

RUN $action = New-ScheduledTaskAction -Execute 'C:\folder\thingy.exe' -WorkingDirectory 'C:\folder'; \
    $trigger = New-ScheduledTaskTrigger -Daily -At 10am; \
    $settings = New-ScheduledTaskSettingsSet;  \
    Register-ScheduledTask -TaskName 'Task name' -User 'SYSTEM' -Trigger $trigger -Action $action -Settings $settings

具体来说,任务似乎运行了——“上次运行”日期/时间正确且结果为 0(零),但控制台应用程序本身并未执行。

在上面的命令中,我设置了工作目录(.NET 控制台应用程序的常见陷阱)。

如果我通过 SSH 进入容器,我可以执行“thing.exe”,并且它会按预期工作。如果我通过 PowerShell 手动执行计划任务Start-ScheduleTask,同样,似乎什么也没有发生。

我尝试使用 PowerShell 查询事件日志,但没有看到任何有用的信息。

上述命令的变体具有更明确的选项(例如兼容性和运行级别)会产生相同的结果 - 即任务不运行:

RUN $action = New-ScheduledTaskAction -Execute 'C:\folder\thingy.exe' -WorkingDirectory 'C:\folder' ; \
    $trigger = New-ScheduledTaskTrigger -Daily -At 10am; \
    $settings = New-ScheduledTaskSettingsSet -Compatibility Win8;  \
    $principal = New-ScheduledTaskPrincipal -UserID 'NT AUTHORITY\SYSTEM' -LogonType ServiceAccount -RunLevel Highest; \
    Register-ScheduledTask -TaskName 'Task name' -Trigger $trigger -Action $action -Settings $settings -Principal $principal

有人遇到过这个问题并解决了吗?或者有人能帮我用 PowerShell 从容器中获取更多诊断信息吗?

谢谢!

答案1

对于将来可能遇到此问题的人:

我在容器中运行了多个进程(我知道,这不是理想的,但在这种情况下是不可避免的),而我的情况是环境变量不适用于计划任务调用的进程。

当环境变量作为 Docker 构建的一部分创建时,创建的任何环境变量仅对 Docker 启动的进程可见 - 例如 IIS。我的计划任务也需要访问相同的环境变量。

解决方案是将 dockerfile 中的入口点更改为 PowerShell 脚本,如建议的那样本文

ENTRYPOINT ["powershell.exe", "C:\\bootstrap.ps1"]

这个引导脚本可以做任何你想做的事情,在这种情况下,它允许我将传递给 Docker 启动的进程(现在是这个脚本)的环境变量“提升”到机器级别,以便容器中的其他进程可以看到它们。

相关内容