# ----------------------------------------------
# Name: Do2
# Description: Expand and execute command
## D20H-35 Expand and execute command
#
# Author: Philip S. Rist
# Date: 10/24/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.
# Usage examples:
#
#[HKEY_CLASSES_ROOT\*\Shell\Do2Bkup]
#@="Backup (Do2)"
#"EditFlags"=hex:01,00,00,00
#[HKEY_CLASSES_ROOT\*\Shell\Do2Bkup\Command]
#@="c:\\sys\\python25\\pythonw.exe c:\\bin\\do2.py \"%1\" c:\\Windows\\system32\\cmd.exe /K copy \"{a}\" \"{u}\\{2}\\{f}\" "
#
#[HKEY_CLASSES_ROOT\*\Shell\Do2Edit]
#@="Edit (Do2)"
#"EditFlags"=hex:01,00,00,00
#[HKEY_CLASSES_ROOT\*\Shell\Do2Edit\Command]
#@="c:\\sys\\python25\\pythonw.exe c:\\bin\\do2.py \"%1\" c:\\Source\\{2}\\qeditor.exe \"{a}\" "
#
import sys, getopt, os
import Do
import subprocess
def ParentSearch(pFilePath, pDefaultPath, pJoin='\\'):
'''
Scan parent list for file selecting lowest level matching file
'''
lParts = pFilePath.split(pJoin)
lCount = len(lParts) - 1
lPath = ''
while lCount > 0:
lPath = pJoin.join(lParts[0:lCount]) + pJoin + lParts[-1]
if os.path.exists(lPath):
break
lCount -= 1
else:
lPath = pDefaultPath
return lPath
def ExpandArg(pArg, pFilePath, pDefaultPath, pLeft='{', pSep=';', pQuote='"',
pPref='{<-}', pJoin='\\'):
'''
Expand single command line argument
'''
# Expand argument
if pArg.find(pLeft) >= 0:
lArg = Do.Expand(pArg, pFilePath)
else:
lArg = pArg
# If starts with {<-} and single path scan parent folders for
# first matching file. Each folder above specified path will
# be checked until file is found.
if lArg.startswith(pPref) and lArg.find(pSep) < 0:
lArg = os.path.abspath(lArg[2:])
print 'Parent Search 1'
lArg = ParentSearch(lArg, pDefaultPath, pJoin=pJoin)
# If multiple paths separated by pSep(';') select first valid path
lFound = ''
if lArg.find(pSep) >= 0:
lPaths = lArg.split(pSep)
for lPath in lPaths:
if lPath.startswith(pPref):
lPath = os.path.abspath(lPath[4:])
lPath = ParentSearch(lPath, pDefaultPath, pJoin=pJoin) # 01/19/11
if lPath == '': #
continue #
lPath = os.path.abspath(lPath)
if os.path.exists(lPath):
lFound = lPath
break
else:
lFound = os.path.abspath(pDefaultPath)
else:
lFound = lArg
# If argument contains space enclose it within quotes
lFound = lFound.strip()
if lFound.find(' ') > 0 and lFound[0] != pQuote:
lFound = pQuote + lFound + pQuote
return lFound
def submitnow(pCommand):
'''
Submit command
'''
lCommand = '"' + pCommand + '"'
#print '\n\nSubmitting:', lCommand
subprocess.Popen(lCommand, shell=True)
#sys.argv.extend( [ '-d', '{o}\\new', 'c:\\source\\python\\new\\do.py', 'c:\\bin\\echop.bat',
# '{a}', '{p}\\test\\{f}', '{<-}\\{p}\\menus.ini', '{t}\\{xx}.bkp',
# '{i}\\{-1}', ' {u}\\{-2}', '{.}\\{-3} ', '"{g}\\{2}\\test.{e}"',
# '{0}\\{3}\\{n}.{e}.txt' ])
if __name__ == '__main__':
(mOptions, mArgs) = getopt.getopt(sys.argv[1:], 'd:e:')
mFilePath = mArgs[0]
mDefaultPath = ''
for (mKey, mValue) in mOptions:
if mKey == '-d':
if mValue.find('}'):
mValue = ExpandArg(mValue, mFilePath, '')
if mValue != '':
os.chdir(mValue)
elif mKey == '-e':
setenviron(mValue, mFilePath)
elif mKey == '-p':
mValue = ExpandArg(mValue, mFilePath, '')
if mValue != '':
mDefaultPath = mValue
mCommand = ''
mCount = 0
for mArg in mArgs[1:]:
mText = ExpandArg(mArg, mFilePath, mDefaultPath) + ' '
#print '%5d: %-24s * %-30s ---> %s' % (mCount, mArgs[mCount+1], mFilePath, mText)
mCommand += mText
mCount += 1
if len(mCommand) > 0:
submitnow(mCommand)
Diff to Previous Revision
--- revision 1 2010-10-25 03:01:06
+++ revision 2 2011-01-19 17:51:13
@@ -84,7 +84,9 @@
for lPath in lPaths:
if lPath.startswith(pPref):
lPath = os.path.abspath(lPath[4:])
- lPath = ParentSearch(lPath, pFilePath, pJoin=pJoin)
+ lPath = ParentSearch(lPath, pDefaultPath, pJoin=pJoin) # 01/19/11
+ if lPath == '': #
+ continue #
lPath = os.path.abspath(lPath)
if os.path.exists(lPath):
lFound = lPath