繁体   English   中英

批处理文件未在任务计划程序中运行python脚本

[英]Batch file not running python script in task scheduler

我有一个剪贴的python脚本和一个批处理文件,当从CMD运行时,它可以完美运行,但是当我尝试从Task Scheduler运行时,什么也没发生。

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

不知道这是否相关,但是脚本会打开Firefox并刮擦某些网站。

尝试将完全权限添加到我正在使用的文件夹和文件中。 另外,已经尝试在Task Scheduler中设置“运行或不运行用户”,“以最高权限运行”,“开始于(可选):添加/脚本/文件/路径”等

批处理文件:

py "C:\python_test\myscript.py"

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

这是myscript.py:

import datetime
import time
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import os

file_path = r"C:\General\{0:%Y%m%d}\results{0:%Y%m%d%H%M%S}.csv".format(datetime.datetime.now())
directory = os.path.dirname(file_path)

try:
    os.stat(directory)
except:
    os.mkdir(directory)

from bs4 import BeautifulSoup


def init_driver():
    caps = DesiredCapabilities.FIREFOX
    caps['marionette'] = True
    driver = webdriver.Firefox(capabilities=caps)
    driver.wait = WebDriverWait(driver, 15)
    return driver


xpath = {
    'english': '//*[@id="xxx"]',
    'soort': '//*[@id="xxx"]/option[text()=\'|- Announcement of change in denominator or in thresholds\']',
    'start': '//*[@id="xxx"]',
    'end': '//*[@id="xxx"]',
    'submit': '//*[@id="xxx"]',
    'pub_sort': '//*[@id="xxx"]',
}

if __name__ == "__main__":

    driver = init_driver()
    try:
        driver.get("http://SOMEWEBSITE") 
        driver.find_element_by_css_selector('[id$=hplEnglish]').click()
    except Exception:
        DoNothing = ""


    time.sleep(2)
    driver.find_element_by_css_selector('[id$=hplEnglish]').click()
    time.sleep(3)
    #alert_obj = driver.switch_to.alert
    #alert_obj.dismiss()
    #driver.find_element_by_xpath(xpath['english']).click()
    today = datetime.datetime.now()
    driver.wait.until(EC.element_to_be_clickable((By.XPATH, xpath['soort']))).click()
    driver.find_element_by_xpath(xpath['start']).send_keys((today-datetime.timedelta(weeks=1)).strftime('%d/%m/%Y'))
    driver.find_element_by_xpath(xpath['end']).send_keys(today.strftime('%d/%m/%Y'))
    driver.find_element_by_xpath(xpath['submit']).click()
    for i in range(2):
        driver.wait.until(EC.element_to_be_clickable((By.XPATH, xpath['pub_sort']))).click()
    time.sleep(5)
    html = driver.page_source
    driver.quit()

    results = BeautifulSoup(html, 'html.parser').find('div', { 'id': 'SearchResults'}).table
    res = [['issuer', 'type', 'date']]
    for x in results.find_all('tr')[1:]:
        # print(x.text.strip())
        try:
            a, b, c = [i.text.strip() for i in x.find_all('td', class_='resultItemTop')[:3]]
            res.append([a,b,c])
        except ValueError:
            continue


    with open(file_path, 'w', newline='') as result:
        writer = csv.writer(result, delimiter=',')
        writer.writerows(res)
        print('finished')

介绍

我建议先阅读, 在执行作为计划任务的批处理文件时必须考虑什么?

问题1:当前目录

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

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

默认情况下,计划任务的当前目录为%SystemRoot%\\System32 ,即Windows系统目录,当然,该目录特别受保护,不能进行修改。 许多批处理文件期望当前目录是该批处理文件的目录,而不是其他任何目录。

解决方案1:在计划任务的属性中的目录中定义“ 启动”

  • 启动Windows Task Scheduler
  • 导航到任务,然后双击它以打开任务的属性
  • 选择选项卡操作 ,然后单击按钮编辑
  • Start in(可选) 在此处输入执行的批处理文件的路径。
  • 在“ 确定 ”按钮上单击两次,以将该重要修改保存在属性中。

解决方案2:使用CD将批处理文件目录设置为当前目录。

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

cd /D "%~dp0"

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

打开命令提示符窗口并运行cd /? 有关命令CD和选项/D

解决方案3:使用PUSHD将批处理文件目录设置为当前目录。

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

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

setlocal EnableExtensions DisableDelayedExpansion
pushd "%~dp0"

批处理文件还应至少包含最后两行,然后退出处理两行的批处理文件:

popd
endlocal

打开命令提示符窗口并运行pushd /? popd /? setlocal /? endlocal /? 寻求有关这四个命令的帮助,并阅读此答案以获取有关这四个命令的更多详细信息。

解决方案4:将所有内容编码为独立于当前目录。

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

此解决方案要求所有文件和目录均指定完整的合格文件/文件夹名称,这意味着完整路径+文件/文件夹名称+文件扩展名。

完整的文件/文件夹路径可以从执行时的已知路径中获取,例如批处理文件的路径,可以在批处理文件内用%~dp0进行引用,并且可以扩展为始终以反斜杠结尾的路径字符串,这意味着可以将其与文件/文件夹名称,不使用其他反斜杠。

另请参阅有关Windows环境变量的 Wikipedia文章。

问题2:环境变量

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

打开从Windows 控制面板从产品系统高级系统设置或按键组合运+歇如果键盘有一个键 (经常交替功能需要按下另外的关键,FN)和点击在左侧高级系统设置下。 将打开“ 系统属性”对话框,然后选择“ 高级”选项卡,该选项卡的底部包含“ 环境变量... ”按钮,必须单击该按钮才能打开“ 环境变量”窗口。

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

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

请查看“无法将X识别为内部或外部命令,可操作程序或批处理文件”的原因是什么? 有关system用户本地 PATH以及环境变量PATHEXT更多信息,用于在批处理文件中仅写入py而不是具有完全限定文件名的脚本/可执行文件。

所以绝对好用

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

而不是使用

py "C:\python_test\myscript.py"

这导致cmd.exe使用本地 PATHEXT本地 PATH环境变量在文件py搜索,如果在用户 PATH定义了包含py的文件夹,则该文件可以归档。

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

问题3:网络资源

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

结论

在我看来,优良作法是编写一个作为计划任务执行的批处理文件,以尽可能独立于Windows任务计划程序本身执行的其他批处理文件和未在该批处理文件中定义的环境变量。 依赖于其他脚本文件和在主脚本之外定义的变量的设计通常会迟早(有时是几年后)导致意外的执行问题。

编写为按计划任务执行的脚本的程序员应该非常了解脚本和被调用的可执行文件正常运行所依赖的文件,库,环境变量和注册表项/值。

仅包含一行以一个参数执行一个应用程序的批处理文件是完全不必要的,并且由于要运行的可执行文件,潜在的原因是无法运行计划任务,在这种情况下,也可以直接在计划任务的属性中设置其参数。 由于Windows任务计划程序可以直接运行Windows Server Scheduler,因此绝对不需要运行带有隐式选项/C %SystemRoot%\\System32\\cmd.exe来处理仅包含一个命令行的指定批处理文件,以执行具有零个或多个参数的应用程序。应用程序及其参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM