Welcome, guest | Sign In | My Account | Store | Cart
#
 ----------------------------------------------
# Name: Do
# Description: Expand and execute command
## D20H-35 Expand and execute command
#
# 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.

# Usage examples:
#
#[HKEY_CLASSES_ROOT\*\Shell\DoBkup]
#@="Backup (Do)"
#"EditFlags"=hex:01,00,00,00
#[HKEY_CLASSES_ROOT\*\Shell\DoBkup\Command]
#@="c:\\sys\\python25\\pythonw.exe c:\\bin\\do.py \"%1\" 
c:\\Windows\\system32\\cmd.exe /K copy \"{a}\" \"{u}\\{2}\\{f}\"      "
#
#[HKEY_CLASSES_ROOT\*\Shell\DoEdit]
#@="Edit (Do)"
#"EditFlags"=hex:01,00,00,00
#[HKEY_CLASSES_ROOT\*\Shell\DoEdit\Command]
#@="c:\\sys\\python25\\pythonw.exe c:\\bin\\do.py \"%1\" 
{o}\\qeditor.exe  \"{a}\"     "
#


import sys
import os
import getopt

#                    Used only by the {o} option which you will
#                    probably want to remove
from _winreg import *

import subprocess

def Expand(pCommand, pFilePath, pSep='\\'):
    'Replace all {?} macros in pCommand'
#             Split file path into parts
    if len(pFilePath) > 0:
        lFilePath  = os.path.abspath(pFilePath) 
        lEndPos    = lFilePath.rfind(pSep)
        lPath      = lFilePath[0:lEndPos]
        lFileName  = lFilePath[lEndPos+1:]
        lEndPos    = lFileName.rfind(".")
        lName      = lFileName[:lEndPos]
        lFilePart  = lPath + pSep + lName
        lExtension = lFileName[lEndPos+1:]
        lPathParts = lFilePath.split(pSep)
    else:
        lFilePath = lPath=lFileName=lName=lFilePart=lExtension=""
        lPathParts = []

    lParts = pCommand.split('{')
    if len(lParts) == 1:                              # no replacements
        lCommand = pCommand
    else:                                             # scan and replace
 commands
        lCommand = lParts[0]
        for lPart in lParts[1:]:                      # for each 
replacement
            lPos = lPart.find('}')
            lCh = lPart[0].lower()
            if lPos == 1:
                lPos = 0
                if lCh   == 'a':                          # entire file 
path
                    lInsert = lFilePath
                elif lCh == 'b':                          # file path 
except extension
                    lInsert = lFilePart
                elif lCh == 'p':                          # path to 
folder containing file
                    lInsert = lPath
                elif lCh == 'f':                          # file name 
without path
                    lInsert = lFileName
                elif lCh == 'n':                          # file name 
without path or extension
                    lInsert = lName
                elif lCh == 'e':                          # extension
                    lInsert = lExtension
                elif lCh == 't':
                    lInsert = "c:\\temp"                  # temporary 
directory
                elif lCh == 'i':
                    lInsert = "c:\\bin"                   # installation
 directory
                elif lCh == 'u':
                    lInsert = "c:\\_Backup"               # backup 
directory
                elif lCh == 'o':                          # source 
directory
                                                          # I added a 
SourceDir key for each programming
                                                          # language 
extension.  This replacements is
                                                          # replaced by 
that text.
                    try:
                        lKey = OpenKey(HKEY_CLASSES_ROOT, '.' + 
lExtension)
                        lIndex = 1
                        while lIndex < 10:
                            try:
                                lValue = EnumValue(lKey, lIndex)
                                if lValue[0] == 'SourceDir':
                                    lInsert = lValue[1]
                                    break
                            except Exception ,e:
                                lInsert =  "c:\\unknown_type"
                                break
                            lIndex += 1
                        else:
                            lInsert = "c:\\unknown_type"
                    except Exception, e: 
                        lInsert = "c:\\unknown_type"                # 
{o}
                elif lCh == 'y':
                    lInsert = "c:\\sys"                   # System 
directory
                elif lCh == 'w':
                    lInsert = "c:\\windows\\system32"     # Windows 
directory
                elif lCh == 'v':
                    lInsert = "j:\\_Backup"               # Archive 
directory
                elif lCh == 'l':
                    lInsert = "c:\\Library"               # Library 
directory
                elif lCh == 'g':
                    lInsert = "c:\\Program Files"         # Program 
Files directory
                elif lCh == '.':
                    lInsert = os.getcwd()                 # Current 
directory
                elif lCh == '*':                          # System 
command
                    lInsert = 'c:\\windows\\system32\\cmd.exe'
                elif lCh == '+':                          # Python
                    lInsert = 'c:\\sys\\python25\\python.exe'
                #elif lCh == '%':
                #    try:
                #        lPos = lPart[1:].find("%")
                #        if lPos > 1:
                #            lKey = lPart[1:lPos]
                #            lInsert = os.environ[lKey]
                #            lPos += 1
                #        else:
                #            lInsert = ''
                #    except:
                #        lInsert = ''
                elif lCh == '0':                          # Drive letter
 (ie. c:\source\python\new\test.py --> c:\)
                    lInsert = lPathParts[0]
                elif lCh == '1' and len(lPathParts) > 1:  # First 
level  (ie. c:\source\python\new\test.py --> source)
                    lInsert = lPathParts[1]
                elif lCh == '2' and len(lPathParts) > 2:  # Second 
level (ie. c:\source\python\new\test.py --> python)
                    lInsert = lPathParts[2]
                elif lCh == '3' and len(lPathParts) > 3:  # Third 
level (ie. c:\source\python\new\test.py --> new)
                    lInsert = lPathParts[3]
                else:
                    lInsert = '{' + lPart
                    
            elif lCh == '-' and lPos == 2:
                lPos = 1
                lCh = lPart[1]
                if lCh == '1' and len(lPathParts) > 2:     # Last 
level (ie. c:\source\python\new\test.py --> new)
                    lInsert = lPathParts[-2]
                elif lCh == '2' and len(lPathParts) > 3:   # Next to 
last level (ie. c:\source\python\new\test.py --> python)
                    lInsert = lPathParts[-3]
                elif lCh == '3' and len(lPathParts) > 4:   # Second 
to last level (ie. c:\source\python\new\test.py --> source)
                    lInsert = lPathParts[-4]
                else:
                    lInsert = '{' + lPart[lPos+2]
            else:
                lInsert = '{' + lPart[lPos+2]

            lPart = lInsert + lPart[lPos+2:]
            lCommand += lPart
    return lCommand

def submitnow(pCommand, pFileName):
    'Expand and submit command'
    lCommand = Expand(pCommand, pFileName)
    lCommand = '"' + lCommand + '"'
    subprocess.Popen(lCommand, shell=True)

def setenviron(pValue, pFileName):
    'Set environment variable'
    lParts = pValue.split('=')
    if len(lParts) > 1:
        lKey = lParts[0]
        lValue = lParts[1]
        if lValue.find('{') >= 0:
            lValue = Expand(lValue, pFileName)
        os.environ[lKey] = lValue
    else:
        os.environ[pValue] = ''

#sys.argv.extend( [ '-d', '{o}\\new', 'c:\\source\\c\\test\\menus.ini', 
'c:\\bin\\echop.bat', '{a}', '{p}\\test\\{f}', '{b}.exe', 
'{t}\\{n}.bkp',
#                    '{i}\\{-1}', '{u}\\{-2}', '{.}\\{-3}', 
'"{g}\\{2}\\test.{e}"', '{fp}', '{0}\\{3}\\{n}.{e}.txt'    ])

#   Syntax: [Options] file-path command

if __name__ == '__main__':
    (mOptions, mArgs) = getopt.getopt(sys.argv[1:], 'd:e:')
    if len(mArgs) > 1:
        mFileName = mArgs[0]
        mCommand = ' '.join(mArgs[1:])
    
        for (mKey, mValue) in mOptions:
            if mKey == '-d':                 # Set current directory
                if mValue.find('}') >= 0:
                    mValue = Expand(mValue, mFileName)
                os.chdir(mValue)
                
            elif mKey == '-e':               # Set environment variable
                setenviron(mValue, mFileName)
                            
        submitnow(mCommand, mFileName)
    else:
        print 'Command and/or file path missing'
    

    

History