【问题标题】:Task Scheduler executes script but does not output to log file任务计划程序执行脚本但不输出到日志文件
【发布时间】:2023-02-21 20:35:48
【问题描述】:
我遇到了以下问题:
我有一个跨多个 Azure VM 运行的任务计划程序作业,它计划在每周三晚上 11 点左右运行。
据我所见,脚本执行了所需的更改,但它不会生成日志输出文件
enter image description here
我使用的论据如下:
-F C:\Users\Admin\Desktop\scripts\automatexml_weu.ps1 -详细 > C:\Users\Admin\Desktop\scripts\xml_script_logs\xml_script_output_$(Get-Date
-格式“yyyyMMdd”).log
但是永远不会生成日志文件。
如果我在 Task Scheduler 之外运行上述命令,它可以正常工作
有人知道我哪里出错了吗?
提前致谢
【问题讨论】:
标签:
powershell
windows-task-scheduler
【解决方案1】:
不幸的是,似乎不可能通过任务计划程序以这种方式执行此操作。
“计划任务无法以这种方式重定向。您必须重定向到 PowerShell 脚本内的文件。支持该重定向的是 PowerShell。”- technet
【解决方案2】:
有点晚了,但它可能会帮助其他人。在任务调度程序中重定向 powershell 输出有点棘手。
如果您使用 -file 参数传递脚本,则重定向始终由任务调度程序 CLI 处理,它完全不知道 $(Get-Date -format "yyyyMMdd") 的含义并尝试(未成功)将其解释为文件名。此外,由于 $(Get-Date -format "yyyyMMdd") 包含空格字符,CLI 将其拆分为多个参数,给命令行增加了更多混乱。如果你确实想使用-file,你必须从%date%重建日期
另一方面,如果您将 -file 替换为 -command 并将 > 引用为 ^ 以将其从任务调度程序 CLI 中隐藏,则重定向将由理解 $(Get-Date -format "yyyyMMdd") 的 powershell 处理。请注意,任务调度程序 CLI 以与 CMD 相同的方式解释 ",因此它将删除它们。在这种情况下,这不是问题,因为 Get-Date 的 -f 正在等待 [String] 参数,但是如果您使用 $((get-date).tostring("yyyyMMdd")),您将收到错误消息。所以只需将"替换为'(例如$((get-date).tostring('yyyyMMdd')))
总而言之,您的参数应为-command C:UsersAdminDesktopscriptsutomatexml_weu.ps1 -Verbose ^> C:UsersAdminDesktopscriptsxml_script_logsxml_script_output_$(Get-Date -format 'yyyyMMdd').log
最后一点,如果你只重定向流 1,你将只会得到你的脚本发送到输出流的内容,而永远不会得到错误/警告/详细/流的内容。如果您对它们感兴趣(我想您在命令中有-verbose),只需将命令参数中的^>替换为^*^>即可。