我们开发了一个可以在 Windows 或 Linux 上部署的 Web 应用程序。Linux 实现使用 cron,Windows 实现使用计划任务来运行单个 PHP 脚本,该脚本处理我们系统的所有计划任务。
schtasks
该任务是在安装过程中安排的,例如:
这在 W2003 和 W2008 下始终有效。一周前,一位客户报告说计划任务未运行。他使用的是 Windows 2008。我们反复检查,最终通过将包含 .vbs 脚本的文件夹输入为计划任务的“启动位置”文件夹解决了该问题。
话虽如此,如果不使用任务的 XML 定义,就无法设置“开始于...”值schtasks
。XML 定义在 Windows 2003 中不起作用,所以我必须在安装程序中添加 Windows 版本检测、附加测试等(如果可能的话,我希望避免这种情况)。
我注意到的关于安装的唯一不典型的事情是系统安装在D:\
而不是默认的C:\Program Files (x86)\
,但我不明白这有什么关系。所有脚本中的所有路径都是绝对路径。
有人能为此提出一个合理的解决方案吗?
答案1
“开始于”主要是为了确保如果在要运行的任务中有相对路径,它就知道在哪个目录中运行脚本。
话虽如此,这个链接可能会对你有帮助:https://stackoverflow.com/questions/1020023/specifying-start-in-directory-in-schtasks-command-in-windows
答案2
解决方案到底是什么?
该start in
值就是其字面意思,即应用程序/程序/脚本启动的目录。这对于调用其他资源时很重要。如果它调用somecustom.exe
不在该start in
目录中的资源,则将找不到它,并且您的应用程序/程序/脚本将出错。如果您完全按路径调用所有内容,则应该没有关系,但您描述的行为似乎表明它实际上并没有这样做,因此您可以尝试纠正该行为,或者快速的解决方法(如果丑陋且有点糟糕的解决方案实际上使代码正确)是将目录添加到变量中%PATH%
,因此当调用可执行文件而没有引用路径时,Windows 将始终检查目录。
如果你使用的是 Windows 2008/7/Vista,你也可以使用开关设置start in
目录schtasks /v1
,只要您不尝试在该SYSTEM
帐户下运行任务即可。我想我更愿意让开发人员调试他的代码,但 YMMV。