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

3
我有一个Perl脚本,使用反引号调用Windows上的程序,在命令提示符中运行时正常工作,但在使用Windows任务计划程序运行时停止工作。这是在安装了ActiveState Perl的Windows Server 2008 x64上,它会给我一个错误:"未将"programname"识别为内部或外部命令、可执行程序或批处理文件。"一旦我将对程序的调用更改为指向程序的完整路径,它就能再次运行。
因此,当使用反引号在任务计划程序中运行时,某些内容会阻止其访问Windows环境变量,特别是%PATH%变量。也许由反引号生成的shell缺少某些内容?我应该使用不同的命令来执行系统调用吗?或者有没有任务计划程序设置可以解决这个问题?如果有人能帮忙,我会很感激。
说实话,我的环境比这个更复杂,但这就是我找到的。实际上,我有一个包含批处理文件的任务计划程序,该批处理文件运行一个运行perl脚本的php脚本,然后perl脚本再运行该程序。我之前没有提到的堆栈的其他部分似乎可以访问%PATH%,因此批处理文件运行“php ...”,php脚本运行“perl ...”,然后在使用反引号运行“programname”时perl脚本失败。我已经删除了批处理文件和php脚本,但仍然遇到相同的问题,只有任务计划程序和perl文件。

1
让你的 Perl 脚本在相同的上下文中运行 path > c:\logfile.txt,这样你就可以看到 PATH 的确切设置。 - Harry Johnston
Unix的人经常会遇到这样的问题。Shell脚本在命令行上运行但不在cron中运行 - mob
无论是Unix还是其他操作系统,我希望那些设置了定时任务来启动批处理文件、运行PHP脚本并最终执行Perl脚本的人们能够注意一下。这里涉及到的环节实在是太多了,有点让人摸不着头脑。 - Sinan Ünür
我找到了两个解决方法。第一个是重新启动计算机。第二个是确保您的任务计划设置为“无论用户是否登录”。(最接近该选项的命令行参数是schtasks的/NP参数)由于某种原因在该场景中运行计划会访问当前的% PATH%变量。 我不确定但是我认为这会破坏需要与桌面交互的脚本。 - TinyGrasshopper
@TinyGrasshopper:既然你已经解决了这个问题,你应该将解决方案发布为答案。谢谢。 - Harry Johnston
显示剩余3条评论
3个回答

2

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

我找到了两种解决方法。

一种方法是重新启动机器。

第二种方法是确保您的任务计划设置为“无论用户是否登录都运行”(最接近该选项的命令行参数是schtasks的/NP参数)。由于某种原因,在这种情况下运行计划将允许其访问当前的%PATH%变量。但我不确定这会破坏需要与桌面交互的脚本。


0
如果您拥有管理员访问权限,可以定义系统范围的%PATH%。用户的%PATH%会增补它。在用户帐户下运行的常规程序应该能够看到系统范围的%PATH%
我不知道您是从GUI还是使用AT计划任务,但计划任务无法访问用户环境变量可能会有所帮助。

我认为这种情况下的%PATH%是系统范围内的%PATH%。无论如何,这并不重要,因为计划任务是以管理员帐户运行的。该任务是使用schtasks进行调度的。 - TinyGrasshopper

0

我也遇到了同样的问题,或者至少是类似的问题。我将省略我的调查中的详细信息。解决方案是UAT在起作用。

我在Windows 7机器上拥有本地管理员权限。我需要进入管理工具 -> 本地安全策略 -> 安全选项并启用用户账户控制:所有管理员以管理员批准模式运行。重新启动-然后就完成了。我的脚本现在在任务计划程序中运行了。

希望这可以帮到你。


该选项默认已启用。您之前禁用过它吗? - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接