# -*- coding: cp1252 -*- # PeJBshell # Michel Claveau Informatique # http://mclaveau.com # GlobalPVersion="0.11" #------------------------------Console-début------------------------ def affich(txt): g.console.text(0,g.consoleNbLig,g.consoleprompt+txt+' '*30) def echoprompt(txt): echoline(u1252(g.consoleprompt+txt)+' '*30) def echoline(txt): st=upe(txt) pas=30000 for i in range(0,len(st),pas): g.console.write(upe(st[i:i+pas])) #g.console.scroll((0,0,80,g.consoleNbLig),0,-1) print def echolist(ltxt): if ltxt: #if type(ltxt) in (types.StringType,types.StringTypes): if type(ltxt) in (types.ListType,types.ListType): for i in ltxt: echoline(i) else: echoline(ltxt) def tabcomplet(txt, flagtab): if flagtab==-1: nom='' pat='' ltmp=txt.split(' ') g.tabprefixe=' '.join(ltmp[:-1]) if len(g.tabprefixe)>1: g.tabprefixe+=' ' nom=ltmp[-1] if nom.find('\\')>-1: ltmp=nom.split('\\') pat='\\'.join(ltmp[:-1])+'\\' g.tabprefixe+=pat nom=ltmp[-1] import subprocess p=subprocess.Popen('dir '+pat+nom+'* /b', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, bufsize=1) (data,err)=p.communicate() tmp=data.replace('\r\n', '\n') g.tablistpersist=tmp.split('\n')[:-1] flagtab+=1 try: vret=g.tabprefixe+g.tablistpersist[flagtab % len(g.tablistpersist)] except: vret='' return vret def sai(valeur=''): txt=str(valeur) pos=len(txt) code=None lig=numlig flagtab=-1 while 1: affich(txt) g.console.pos(pos+len(g.consoleprompt), g.consoleNbLig) g.console.cursor(1) k=g.console.getchar() if len(k)>1: g.console.text(70,1,"k:"+k) if k=='Tab': txt=tabcomplet(txt, flagtab) pos=len(txt) flagtab+=1 continue else: flagtab=-1 if k=='space': k=' ' if k=='Escape': code=k break if k=='F1': startfile('http://ponx.org/ponx/pejbshell.htm') continue elif k=='Caps_Lock' or k=='Insert': pass elif k=='Shift_L' or k=='Shift_R': pass elif k=='Caps_Lock': pass elif k=='Return': print #g.console.scroll((0,0,80,g.consoleNbLig),0,-1) g.console.pos(0, g.consoleNbLig) break elif k=='BackSpace': if pos>0: txt=txt[:pos-1]+txt[pos:] pos-=1 elif k=='Delete': if pos<=len(txt): txt=txt[:pos]+txt[pos+1:] elif k=='Home': pos=0 elif k=='End': pos=len(txt) elif k=='Left': if pos>0: pos-=1 elif k=='Right': if pos>0: pos+=1 elif k=='Up': lig-=1 if lig<0: lig=numlig-1 txt=lin[lig] pos=len(txt) elif k=='Down': lig+=1 if lig>=numlig: lig=0 txt=lin[lig] pos=len(txt) else: if len(k)==1: txt=txt[:pos]+k+txt[pos:] pos+=1 return txt,code #------------------------------Console-fin-------------------------- def runmacro(fichier): global pmacro,imacro data=file(fichier,'r').read() tmp=data.replace('\r\n', '\n') pmacro=tmp.split('\n') imacro=0 def u1252(chu): try: if type(chu) is unicode: return chu.encode('cp1252','replace') else: return chu except: return repr(chu) def u850(chu): try: if type(chu) is unicode: return chu.encode('cp850','replace') else: return chu.decode('cp1252').encode('cp850','replace') except: return repr(chu) def u437(chu): try: if type(chu) is unicode: return chu.encode('cp437','replace') else: return chu.decode('cp1252').encode('cp437','replace') except: return repr(chu) def upe(chu): return str(chu) def uniw32dia(suni, titre=u'Texte unicode', typ=0): #visu un txt unicode dans une boîte d'alerte import ctypes MessageBoxW = ctypes.windll.user32.MessageBoxW MessageBoxW.argtypes = ctypes.c_int, ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_int return MessageBoxW(0, suni, titre, typ) #en retour : 6 = OUI 7 = NON def uniw32diaA(suni, titre=u'Texte unicode', typ=0): #visu un txt unicode dans une boîte d'alerte import ctypes MessageBoxA = ctypes.windll.user32.MessageBoxA MessageBoxA.argtypes = ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int return MessageBoxA(0, suni, titre, typ) #en retour : 6 = OUI 7 = NON def msginfo(titre='Titre',txt='Texte'): try: uniw32dia(u1252(txt.decode('utf-8')),u1252(titre.decode('utf-8'))) except: uniw32dia(u1252(txt),u1252(titre)) def msginfoA(titre='Titre',txt='Texte'): uniw32diaA(txt,titre) def lload(fichier): data=file(fichier,'r').read() tmp=data.replace('\r\n', '\n') l=tmp.split('\n') return l def lwrite(fichier,lst): f=file(fichier,"w") f.write(upe('\r\n'.join(lst))) f.close() def bufferin(num): global lin if num<0: return lin[numlig+num] else: return lin[num] def bufferout(num): global lout if num<0: return lout[numlig+num] else: return lout[num] def lbufferin(num): global lin if num<0: return lin[numlig+num].split('\n') else: return lin[num].split('\n') def lbufferout(num): global lout if num<0: return lout[numlig+num].split('\n') else: return lout[num].split('\n') def cmdp2(lst=None): a = os.popen4(upe(lst[0])) for i in lst[1:]: if i!='': a[0].write(i+'\r\n') a[0].flush() #lsterr=a[0].readlines() lret=a[1].readlines() if len(lret)>1: lret='\n'.join(lret) else: lret=lret return lret def cmdp(lst=None): #p=subprocess.Popen(str(''.join(lst)), shell=True, stdout=subprocess.PIPE).stdout p=subprocess.Popen(u850(''.join(lst)), shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) data=p.stdout.read() tmp=data.replace('\r\n', '\n') lret=tmp.split('\n') #echolist(lret) err=p.stderr.read() if len(err)>0: tmperr=err.replace('\r\n', '\n') lsterr=tmperr.split('\n') echo("Erreur cmd. ") echolist(err) if len(lret)>1: lret='\n'.join(lret) else: lret=lret #echo(lst) return lret def echo(ltxt): echolist(ltxt) def fichierw(txt): f=file("temp.txt","wu") f.write(upe(txt)) f.close() def trtDOS(lig): global numlig lout=None try: if lig[:5].upper()=='CD /D': os.chdir(ligin[5:].lstrip()) elif lig[:2].upper()=='CD': os.chdir(ligin[2:].lstrip()) elif lig[0]=='.' : lout=trtPYT(lig[1:]) else: lout=cmdp([lig]) except: lout='Error' pass return lout def trtPYT(lig): global numlig,pmode lout=None try: if lig[0]=='.' : lout=trtDOS(lig[1:]) else: try: try: lout=eval(lig) except: exec(lig,globals(),globals()) except: #msginfo("pb avec ponx:PRun') #msginfo("Type_erreur: ",str(sys.exc_info()[0])) #msginfo("Valeur erronnée: ",str(sys.exc_info()[1])) tb=sys.exc_info()[2] #traceback print "erreur dans EXEC" print str(sys.exc_info()[0]) print traceback.format_exc() #msginfo(str(sys.exc_info()[0]),traceback.format_exc()) except: lout='Error' return lout def saimulti(): multi=[] nb=1000 while 1: nb+=1 prompt='Multi.'+str(nb)[1:]+'>' lig,cod=sai(prompt) if lig.upper()=='QUIT' or lig.upper()=='EXIT' or lig.upper()=='END': break multi.append(lig) return '\n'.join(multi)+'\n' #--------------------------------------mainloop--------------------------- def mainloop(repinitial='', macroinitial=None): global numlig,maxlig,pmode,lin,lout,imacro,pmacro if repinitial!='': os.chdir(repinitial) if macroinitial==None: imacro=-1 else: imacro=0 pmacro=macroinitial while 1: if numlig>maxlig: lin={} lout={} numlig=-1 numlig+=1 g.consoleprompt=str(numlig)+'.'+os.getcwd()+'>' if imacro>-1: imacro+=1 if imacro>=len(pmacro): imacro=-1 if imacro>-1: ligin=pmacro[imacro] echoprompt(ligin) time.sleep(0.1) else: ligin,cod=sai() ligout=None try: #print #print "pmode",pmode,ligin if ligin.upper()=='QUIT' or ligin.upper()=='.Q' or ligin.upper()=='EXIT': break lin[numlig]=ligin if ligin[0]==':': continue if ligin[:2].upper()=='CD': os.chdir(ligin[2:].lstrip()) continue if ligin.upper()=='.MULTI': ligin=saimulti() lin[-1]=ligin if ligin.upper()[:4]=='.DOS': ligin='.PMODE(DOS)' lin[-1]=ligin if ligin.upper()[:4]=='.PYT': ligin='.PMODE(PYTHON)' lin[-1]=ligin if ligin.upper()[:2]=='..': runmacro(ligin[2:]) continue if ligin[0]=='.' : cde=ligin[1:].upper() if cde=='EMPTY': lin={} lout={} numlig=-1 continue elif cde=='EDIT': ltmp=[] for i in range(1,numlig): ltmp.append(lin[i]) txt='\n'.join(ltmp) fichierw(txt) #startfile(os.getcwd()+'\\temp.txt') st='"'+editor+'" "'+os.getcwd()+'\\temp.txt"' #os.system(st) from subprocess import Popen p=Popen(st, shell=False) continue elif cde=='OUTEDIT': txt=bufferout(-1) fichierw(txt) #startfile(os.getcwd()+'\\temp.txt') st='"'+editor+'" "'+os.getcwd()+'\\temp.txt"' #os.system(st) from subprocess import Popen p=Popen(st, shell=False) continue elif cde=='PMODE': print 'pmode :',pmode continue elif cde[:6]=='PMODE(': if cde[6]=='D': pmode='DOS' else: pmode='PYTHON' print 'pmode :',pmode continue if pmode=='DOS': ligout=trtDOS(ligin) elif pmode=='PYTHON': ligout=trtPYT(ligin) else: ligout='' lout[numlig]=ligout echo(ligout) except: print 'Error (mainloop)' pass if __name__=='__main__': import sys,time,Console from sys import * from os import * from os.path import * from shutil import * from sets import * import sys,os,os.path,shutil,time import types import subprocess from win32com.client import Dispatch try: px=Dispatch('ponx.Mci') pxd=Dispatch('ponxd.Mci') except: px=pxd=None class globa(object): consoleprompt="AAA>" console=Console.getconsole() console.title("PeJBshell") tablistpersist=[] print "Size :",console.size() consoleNbLig=console.size()[1]-1 tabprefixe='' g=globa() lin={} lout={} maxlig=100 numlig=-1 editor="notepad" #editor="C:\Program Files\Windows NT\Accessoires\wordpad.exe" #pmode='PYTHON' pmode='DOS' pmacro=[] imacro=-1 if len(sys.argv)>1: rep=sys.argv[1] else: rep='C:\\' mainloop(rep)