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