# ----------------------------------------------
# Name: Do
# Description: Expand and execute command
## D20H-23 Do command from Windows registry
#
# Author: Philip S. Rist
# Date: 10/12/2010
# Copyright 2010 by St. Thomas Software
# ----------------------------------------------
# This program is freeware. It may be used
# for any moral purpose. You use it at your
# own risk. St. Thomas Software makes no
# guarantees to its fitness to do anything.
#
# If you feel you must pay for it. Please
# send one million dollars to
#
# The International Rescue Committee
# 122 East 42nd Street
# New York, N.Y. 10168-1289
#
# Ok, we are in a recession. So, make it a half
# million.
from _winreg import *
import sys, os, os.path, getopt
import subprocess
import Do
def SubmitNow(pCommand):
'Execute command'
lCommand = '"' + pCommand + '"'
#lCommand = 'c:\\bin\\messagebox.exe ' + lCommand
subprocess.Popen(lCommand, shell=True)
def GetExtensionInfo(pExtension):
'Extract data saved in registry for specific extension'
lHandle = OpenKey(HKEY_CLASSES_ROOT, pExtension)
lSubKeys, lValueCount, lModified = QueryInfoKey(lHandle)
lValues = {}
for lCount in range(0, lValueCount):
lName, lValue, lType = EnumValue(lHandle, lCount)
if lName == '':
lName = "File Type"
lValues[lName] =lValue
lKey = lValues['File Type']
lDescription = QueryValue(HKEY_CLASSES_ROOT, lKey)
lValues['Description'] = lDescription
lKey += '\\Shell'
lDefault = QueryValue(HKEY_CLASSES_ROOT, lKey)
lValues['Default'] = lDefault
return lValues
def GetCommand(pFileType, pKey):
'Retrieve text for selected command'
lAbort = False
try:
lKey = pFileType + "\\Shell\\" + pKey + "\\Command"
lText = QueryValue(HKEY_CLASSES_ROOT, lKey)
except:
lText = ''
lAbort = True
return (lAbort, lText)
def BuildCommand(pExpandFile, pKey, pExtension, pArgs, pVerbose=False):
'''
The extension from pExpandFile is used to select the command associated with
the command named in pKey for the file type associated with the given extension.
pExpandFile - File to be processed
pKey - Command name
pExtension - Extension used to select command text
pArgs - Passed arguments
Note: c:\messagebox.exe displays its command line in a popup window.
'''
if pVerbose: # not currently used for anything
lValues = GetExtensionInfo(pExtension)
else:
lValues = {}
if len(pArgs) > 1:
pArgs = pArgs[1:]
else:
pArgs = []
lExpandFile = pExpandFile
lKey = pKey
lAbort = False
lText = ''
if len(lKey) > 0 and len(lExpandFile) > 0:
lPos = lExpandFile.rfind('.')
if lPos > 0:
if pExtension == '':
lExtension = lExpandFile[lPos:]
else:
lExtension = pExtension
lFileType = QueryValue(HKEY_CLASSES_ROOT, lExtension)
if len(lFileType) > 0:
(lAbort, lText) = GetCommand(lFileType, lKey)
if lAbort:
(lAbort, lText) = GetCommand('*', lKey)
else:
lAbort = True
pass
else:
lAbort = True
pass
else:
lAbort = True
pass
lArgs = ''
if len(pArgs) > 0:
lArgs = ' '.join(pArgs)
if not lAbort:
if lText.find("%") >= 0:
lText = lText.replace("%1", str(lExpandFile))
for lCount in range(0,len(pArgs)):
lString = '%' + str(lCount+2)
lText = lText.replace(lString, pArgs[lCount])
lText = lText.replace("%*", lArgs)
else:
lText += " " + lExpandFile + " "+ lArgs
if lText.find('{') >= 0:
lText = Do.Expand(lText, lExpandFile)
else:
lText = ''
return lText
def DoCommand(pExpandFile, pKey, pExtension, pArgs, pVerbose=False):
lCommand = BuildCommand(pExpandFile, pKey, pExtension, pArgs, pVerbose)
if len(lCommand) > 0:
SubmitNow(lCommand)
else: # requires a program that will display passed arguments
# SubmitNow("c:\\bin\\messagebox.exe DoCommand: Execution aborted for " + pKey +
# " on file " + pExpandFile )
print 'Command not generated'
# DoCommand is designed to be executed from another program such as QEditor or Crimson Editor
# which allow the user to define external commands.
#
# from QEditor:
# Display References,c:\sys\python25\pythonw.exe c:\bin\DoCommand.py "{a}" RefList
#
# This command will execute the RefList command associated with what ever file is being edited
# passing that file. Most useful with a program such as Crimson Editor which provide for only
# a limited number of user defined commands.
#sys.argv.extend(['-x', '.txt', 'c:\\source\\python\\Projects\\Program Execution\\docommand.py',
# 'Open', 'First', '{p}' ])
# uses Open command for .txt files to open Python source file
if __name__ == '__main__':
lSys = len(sys.argv)
if lSys > 1:
(mOptions, mArgs) = getopt.getopt(sys.argv[1:], 'd:e:vx:')
mFileName = mExpandFile = mArgs[0] # 1st Path to file
if len(mArgs) > 1: # 2nd command name
mCommand = mArgs[1] # 3rd on command arguments
mArgs = mArgs[1:]
else:
mCommand = "Open"
lPos = mExpandFile.rfind('.')
if lPos >= 0:
mExtension = mExpandFile[lPos:]
else:
mExtension = ''
mVerbose = False
for (mKey, mValue) in mOptions:
if mKey == '-d': # Set current directory
if mValue.find('}'):
mValue = Do.Expand(mValue, mFileName)
os.chdir(mValue)
elif mKey == '-e': # Set environment variable
setenviron(mValue, mFileName)
elif mKey == '-v': # Run in verbose mode
mVervose = True
elif mKey == '-x': # override extension where command
mExtension = mValue # is extracted
if mExtension == '':
mExtension = 'txt'
DoCommand(mExpandFile, mCommand, mExtension, mArgs, pVerbose=mVerbose)
else:
#SubmitNow("c:\\bin\\messagebox.exe DoCommand.py requires a file name and a command name")
print "DoCommand.py requires a file name and a command name"
Diff to Previous Revision
--- revision 1 2010-10-25 05:05:52
+++ revision 2 2010-10-25 05:14:49
@@ -1,4 +1,27 @@
+# ----------------------------------------------
+# Name: Do
+# Description: Expand and execute command
## D20H-23 Do command from Windows registry
+#
+# Author: Philip S. Rist
+# Date: 10/12/2010
+# Copyright 2010 by St. Thomas Software
+# ----------------------------------------------
+# This program is freeware. It may be used
+# for any moral purpose. You use it at your
+# own risk. St. Thomas Software makes no
+# guarantees to its fitness to do anything.
+#
+# If you feel you must pay for it. Please
+# send one million dollars to
+#
+# The International Rescue Committee
+# 122 East 42nd Street
+# New York, N.Y. 10168-1289
+#
+# Ok, we are in a recession. So, make it a half
+# million.
+
from _winreg import *
import sys, os, os.path, getopt