使用 python 子流程创建计划任务
creating scheduled tasks using python subprocess
我在使用 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
即使命令行听起来不错,您也应该依赖参数列表,而不是字符串形式的参数。让 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
通话
我在使用 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
即使命令行听起来不错,您也应该依赖参数列表,而不是字符串形式的参数。让 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
通话