批处理文件未在任务调度中运行python脚本

2024-04-25 02:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个废弃的python脚本和一个批处理文件,当我从CMD运行它时工作得很好,但是当我试图从任务调度器运行它时,什么都不会发生。在

我知道有很多关于同一个问题的问题,但我已经尝试了所有的建议答案,似乎没有一个是有效的。在

不知道这是否相关,但脚本会打开Firefox并抓取一些网站。在

已尝试向我正在使用的文件夹和文件添加完全权限。 另外,尝试在任务调度器中设置“在用户是否登录时运行”、“以最高权限运行”、“启动位置(可选):添加/batch/file/path”等

批处理文件:

py "C:\python_test\myscript.py"

它应该运行python脚本来打开Firefox并抓取一些网站,获取它们的链接并将它们保存在csv文件中

给你myscript.py以下内容:

^{pr2}$

Tags: 文件答案用户py脚本文件夹cmd权限
1条回答
网友
1楼 · 发布于 2024-04-25 02:21:30

简介

我建议先读What must be taken into account on executing a batch file as scheduled task?

问题1:当前目录

这里的第一个问题很可能是运行批处理文件时的当前目录。在

Windows在双击批处理文件时将批处理文件的目录设置为当前目录,但批处理文件路径是以\\computername\share\开头的UNC路径。在

默认情况下,计划任务的当前目录是%SystemRoot%\System32,即Windows系统目录,该目录当然受到特殊保护,不会被修改。许多批处理文件都希望当前目录是批处理文件的目录,而不是任何其他目录。在

解决方案1:在调度任务的属性中定义Start in目录

  • 启动Windows任务调度器。在
  • 导航到任务并双击它以打开任务的属性。在
  • 选择tab操作并单击按钮编辑。在
  • 开始(可选)。在这里输入执行的批处理文件的路径。在
  • 单击两次按钮确定将此重要修改保存在属性中。在

解决方案2:使用CD使批处理文件目录成为当前目录

在批处理文件中,在第一行之后插入通常是@echo off行:

cd /D "%~dp0"

只要批处理文件不是使用UNC路径启动的,此命令行会将当前目录从默认的%SystemRoot%\System32更改为批处理文件的目录。在

打开一个命令提示符窗口并运行cd /?以获得关于commandCD和选项/D的帮助。在

解决方案3:使用PUSHD使批处理文件目录成为当前目录

如果批处理文件存储在使用UNC路径访问的网络资源上,并且计划的任务配置为使用凭据(用户帐户和密码)运行,并且具有读取网络资源上批处理文件内容的权限,则此解决方案最为理想。在

在批处理文件中,在第一行之后插入通常是@echo off的行:

^{pr2}$

作为批处理前最后执行的两行文件,还应包含两行:

popd
endlocal

打开一个命令提示窗口,运行pushd /?popd /?setlocal /?和{}来获得这四个命令的帮助,同时阅读this answer以获得关于这四个命令的更多详细信息。在

解决方案4:将所有代码都独立于当前目录

第四种解决方案是编写批处理文件和Python脚本,以便在执行批处理文件和Python脚本时独立于当前目录是哪个目录。在

此解决方案要求所有文件和目录都使用完全限定的文件/文件夹名称指定,这意味着完整路径+文件/文件夹名称+文件扩展名。在

完整的文件/文件夹路径可以从执行时的已知路径派生,例如批处理文件的路径,该路径可在批处理文件中用%~dp0引用,并扩展为始终以反斜杠结尾的路径字符串,这意味着它可以与文件/文件夹名称串联,而不需要使用额外的反斜杠。在

另请参阅维基百科关于Windows Environment Variables的文章。在

问题2:环境变量

计划任务通常使用内置的本地系统帐户执行。因此,为开发和测试批处理文件时使用的用户帐户定义的所有环境变量要么根本没有定义,要么定义不同。在

从Windows控制面板从项目系统打开高级系统设置或按组合键Win+Break(通常作为另一种功能,需要额外按下键Fn),然后单击高级系统上的下一步设置在左侧。系统m属性对话框打开时,选择选项卡高级底部包含按钮环境变量…,必须单击该按钮才能打开环境变量窗口。在

有两个环境变量列表:用户变量…系统变量系统变量是为所有帐户定义的,包括内置的本地系统帐户。用户变量仅为显示的用户定义。在

为当前用户定义的用户变量很重要,这可能是当前用户双击执行的批处理文件正常工作,但不能作为内置系统帐户执行的计划任务的原因。如果所使用的脚本和可执行文件依赖于在用户PATH中定义的本地PATH中定义的特定文件夹路径,则用户PATH通常是不将批处理文件作为计划任务处理的主要原因。在

有关系统用户本地PATH和环境变量{}的更多信息,请查看What is the reason for "X is not recognized as an internal or external command, operable program or batch file"?,而不是完全限定文件名的脚本/可执行文件。在

所以用起来肯定更好

"C:\Python27\python.exe" "C:\python_test\myscript.py"

而不是使用

py "C:\python_test\myscript.py"

这会导致cmd.exe使用localPATHEXTlocalPATH环境变量搜索文件{},如果包含文件py的文件夹在用户PATH中定义,则可以使用这些环境变量进行归档。在

我还没有安装Python,所以不知道py到底是什么。它可以是文件名为py.cmdpy.bat的批处理文件,在这种情况下,如果批处理文件在带有py的命令行之后包含其他命令行,并且可能依赖于用户环境变量,则必须使用命令调用。它可能是指向Python安装文件夹中python.exe的符号链接。我不知道。在

问题3:网络资源

或通过网络访问多个任务或文件夹。在这种情况下,必须将计划任务配置为使用具有访问网络资源上的文件、文件夹或数据所需权限的凭据(用户帐户和密码)运行。在这种情况下,使用内置本地系统帐户几乎永远不是运行计划任务的正确选择,因为本地系统帐户通常没有在任何网络资源上读/写数据的权限。在

结论

我认为,编写一个作为计划任务执行的批处理文件,使其尽可能独立于其他批处理文件和环境变量,而这些文件和环境变量不是由Windows任务调度器自己执行的批处理文件中定义的。依赖于其他脚本文件和在主脚本外部定义的变量的设计通常早晚(有时几年后)会导致意外的执行问题。在

为按计划任务执行而编写的脚本的程序员应该非常清楚脚本和所谓的可执行文件依赖哪些文件、库、环境变量和注册表项/值才能正常工作。在

一个批处理文件只包含一行来执行一个带有某些参数的应用程序是完全不必要的,它只是一个潜在的不工作源,因为可执行文件要运行,它的参数也可以在调度任务的属性中直接设置。绝对不需要使用隐式选项/C运行%SystemRoot%\System32\cmd.exe来处理仅包含一个命令行的指定批处理文件,以执行具有零个或多个参数的应用程序,因为Windows任务调度器可以直接用它的参数运行应用程序。在

相关问题 更多 >