从通过Windows任务计划程序运行的Perl脚本生成的进程无法访问%PATH%

时间:2012-05-11 21:45:40

标签: windows path scheduled-tasks

我有一个Perl脚本,它使用反引号在Windows上调用程序。我在命令提示符下运行它时工作正常。当我使用Windows任务调度程序运行它时它停止工作。这是在带有ActiveState Perl的Windows Server 2008 x64上。它给我一个错误,不被识别为内部或外部命令,可操作程序或批处理文件。一旦我将对程序的调用更改为指向程序的完整路径,它就会再次运行。

因此,当它在带有反引号的任务计划中运行时,它会阻止它看到windows环境变量,特别是运行时的%PATH%变量。由反引号产生的外壳可能会遗漏一些东西?我应该使用不同的命令来执行系统调用吗?或者是否有任务调度程序设置将解决此问题?如果有人可以提供帮助,我会很感激。

说实话,我的环境比这更复杂,但这就是我把它缩小到的范围。我实际上有一个任务计划,其中包含一个运行php脚本的批处理文件,该脚本本身运行perl脚本,然后运行该程序。我以前没有提到的堆栈的其余部分似乎可以访问%PATH%,因此批处理文件运行'php ...'并且php脚本运行'perl ...'然后perl脚本失败使用反引号运行'programname'时。我已经删除了批处理文件和PHP脚本,只有任务调度程序和perl仍然存在这种行为。

3 个答案:

答案 0 :(得分:2)

从perl运行路径基本上帮助我解决了这个问题。问题不在于perl本身,而是在重新启动任务调度程序服务之前,%PATH%变量的更改不会显示给任务调度程序。据我所知,没有重启机器就无法重启任务调度程序。因此,在任务计划中运行时,程序路径未显示,但在命令行中显示。

我找到了两个解决方案。

一个是重新启动机器。

第二个是确保您的任务计划设置为“运行用户是否登录”(该选项最近的命令行参数是schtasks的/ NP参数)由于某种原因,运行计划该方案使其可以访问当前的%PATH%变量。我不确定,但我认为这会打破需要与桌面交互的脚本。

答案 1 :(得分:0)

如果您具有管理员权限,则可以定义系统范围%PATH%。用户%PATH%对其进行了扩充。在用户帐户下的系统上运行的常规程序应该能够看到系统范围%PATH%

我不知道您是从GUI安排任务还是使用AT,但Scheduled Jobs Cannot Access User Environment Variables可能会有所帮助。

答案 2 :(得分:0)

我遇到了同样的问题,或者至少是类似问题。我会饶恕你调查的血腥细节。解决方案是UAT正在阻碍。

我的Windows 7计算机上有本地管理员权限。我不得不进入管理工具>地方安全政策>安全选项和ENABLE用户帐户控制:以管理员批准模式运行所有管理员。重启 - 瞧。我的脚本现在在任务计划程序中运行。

希望这有帮助