python - 使用python子进程创建计划任务

标签 python python-2.7 cmd scheduled-tasks

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

IMG-1: After creating scheduled task using script. Action path is invalid.

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

最佳答案

即使命令行听起来不错,您也应该依赖参数列表,而不是字符串形式的参数。让 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]

然后继续进行子进程调用

关于python - 使用python子进程创建计划任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41676920/

相关文章:

python-2.7 - 如何使用 Tornado 发送 HTTP 广播消息?

batch-file - 如何使用 Windows CMD 根据模式提取部分字符串?

python - 获取 IOError : [Errno Input overflowed] -9981 when setting PyAudio Stream input and output to True

python - Google Cloud Platform - 数据存储 - Python ndb API

Python 2.7 是否存储重复字符串

python-2.7 - Pandas 将列表附加到列名列表

python-twisted 和 SIGKILL

python - 无法使用 multiprocessing.Process() Python 交换对象/超时子进程

c# - 命令完成后获取命令提示符窗口内容

windows - 使用 forfiles 和 7zip 的文件名中的空格