Welcome, guest | Sign In | My Account | Store | Cart
# ----------------------------------------------
# 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

History