【问题标题】:creating scheduled tasks using python subprocess使用 python 子进程创建计划任务
【发布时间】:2017-05-31 07:45:00
【问题描述】:

我在使用 python 创建计划任务时遇到问题。执行我的命令后,计划任务的操作部分拆分为参数和路径切片并使其无效。我尝试了很多方法,例如 "\" mypath \"" 但没有成功。 如何将可执行文件的路径连接到使计划任务的任务操作有效的变量?

import os
import subprocess


path = os.environ['APPDATA']
filename = "test.exe"
path = path+"\\"+filename

command = 'schtasks.exe /CREATE /RU "%USERNAME%" /SC ONLOGON /TN "testServiceHello" /TR "'+path+'"'


proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
stdout_value = proc.stdout.read() + proc.stderr.read()
print stdout_value
print "--"*50
print command

【问题讨论】:

    标签: python python-2.7 cmd scheduled-tasks


    【解决方案1】:

    即使命令行听起来不错,你也应该依赖参数列表,而不是字符串形式的参数。让popen 完成繁重的工作并正确引用您的参数,而不是自己尝试。

    我会重写如下(并会删除shell=True,并直接从subprocess.Popen 合并stdout+stderr 以避免潜在的死锁)

    command = ['schtasks.exe','/CREATE','/RU',os.getenv("USERNAME"),'/SC','ONLOGON','/TN','testServiceHello','/TR',os.path.join(os.environ['APPDATA'],"test.exe")]
    proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    stdout_value = proc.stdout.read()
    

    您可以打印subprocess 将发出的命令,如下所示:

    subprocess.list2cmdline(command)
    

    在您的情况下,您还有一个额外的问题,因为schtasks.exe 似乎存在限制。所以解决方法是计算 windows 短路径(从this SO question 提升)

    import win32api
    long_file_name=os.path.join(os.environ['APPDATA'],"test.exe")
    short_file_name=win32api.GetShortPathName(long_file_name)
    command = ['schtasks.exe','/CREATE','/RU',os.getenv("USERNAME"),'/SC','ONLOGON','/TN','testServiceHello','/TR',short_file_name]
    

    继续拨打subprocess

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 2014-03-23
      • 2021-08-25
      • 2011-11-15
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多