Esecuzione di un file .BAT con parametro da una applicazione VO [Risolto]

Forum dedicato ai programmatori di X# in lingua italiana – Italian language forum

Moderator: wriedmann

Post Reply
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Esecuzione di un file .BAT con parametro da una applicazione VO [Risolto]

Post by claudiocarletta »

Salve a tutti,
per effettuare il salvataggio del database MySQL ho scritto un file SalvaDB.BAT con il parametro timestamp in maniera tale che il file .SQL creato sia riferito alla data e ora attuale.
Eseguendo il file SalvaDB.BAT da riga di comando seguito da una serie di numeri per simulare il timestamp, funziona perfettamente.

Questo è il file SalvaDB.BAT

Code: Select all

@echo off
:: ---- SETUP ----
:: db user name
set dbuser=root
:: db user password
set dbpass=xxxxxxxxx
:: db list (lista di DB separati da uno spazio)
set dblist=apprendistato
:: backup directory destinazione dump
set bkupdir=C:ApprendistatoBackup
:: Cartella di installazione mysql
set mysqldir=C:Program FilesMySQLMySQL Server 8.0
:: Data di sistema
set mydata=%1
:: -----------------------------------------------------
:: NON MODIFICATE SOTTO
echo MySQLDump start >> log.txt
for %%f in (%dblist%) do (
echo backing up %%f ...
"%mysqldir%binmysqldump" --user=%dbuser% --password=%dbpass% --databases %%f --opt --quote-names --allow-keywords --events --routines --complete-insert --skip-lock-tables > "%bkupdir%Apprendistato%mydata%.sql"
echo OK! 
echo backup di %%f OK! >> log.txt
)
echo MySQLDump Finito>> log.txt
echo ----- >> log.txt
echo Procedura terminata correttamente!
Ho fatto il metodo:

Code: Select all

METHOD Salva( )
    LOCAL sNomeFile	AS STRING
    LOCAL sParam	AS STRING
    
    sNomeFile := "SalvaDB.bat"
    SetTimeSep(Asc("_"))
    sParam := DToS(Today()) + Time()
    SetTimeSep(Asc(":"))
    AttivaShellExecute(sNomeFile, sParam)
RETURN NIL
Ho provato con un metodo che ho riesumato da un vecchio programma ma non mi funziona

Code: Select all

METHOD AttivaShellExecute(sNomeFile as STRING, sParam as STRING) 
	LOCAL ptrShEx			AS PTR				
	LOCAL sShEx				AS STRING				
	LOCAL lShEx := FALSE	AS LOGIC
	
	ptrShEx := ShellExecute(oApp:handle(), AsPsz("Open"), AsPsz(sNomeFile),  ;
			  AsPsz(sParam), AsPsz(WorkDir()), SW_SHOWNORMAL)
	DO CASE
		CASE ptrShEx = 0	
			sShEx := "The operating system is out of memory or resources."
		CASE ptrShEx = ERROR_FILE_NOT_FOUND	
			sShEx := "The specified file was not found."
		CASE ptrShEx = ERROR_PATH_NOT_FOUND	
			sShEx := "The specified path was not found."
		CASE ptrShEx = ERROR_BAD_FORMAT	
			sShEx := "The .EXE file is invalid (non-Win32 .EXE or error in .EXE image)."
		CASE ptrShEx = SE_ERR_ACCESSDENIED	
			sShEx := "The operating system denied access to the specified file."
		CASE ptrShEx = SE_ERR_ASSOCINCOMPLETE	
			sShEx := "The filename association is incomplete or invalid."
		CASE ptrShEx = SE_ERR_DDEBUSY	
			sShEx := "The DDE transaction could not be completed because other DDE transactions were being processed."
		CASE ptrShEx = SE_ERR_DDEFAIL	
			sShEx := "The DDE transaction failed."
		CASE ptrShEx = SE_ERR_DDETIMEOUT	
			sShEx := "The DDE transaction could not be completed because the request timed out."
		CASE ptrShEx = SE_ERR_DLLNOTFOUND	
			sShEx := "The specified dynamic-link library was not found."
		CASE ptrShEx = SE_ERR_FNF	
			sShEx := "The specified file was not found."
		CASE ptrShEx = SE_ERR_NOASSOC	
			sShEx := "There IS no application associated with the given filename extension."
		CASE ptrShEx = SE_ERR_OOM	
			sShEx := "There was not enough memory to complete the operation."
		CASE ptrShEx = SE_ERR_PNF	
			sShEx := "The specified path was not found."
		CASE ptrShEx = SE_ERR_SHARE	
			sShEx := "A sharing violation occurred."
		OTHERWISE
			lShEx := TRUE
  ENDCASE
  IF ! lShEx
  	InfoBox{SELF, "Elaborazione ShellExecute", sShEx}:Show()
  ENDIF
RETURN NIL
Il metodo viene eseguito senza alcun errore apparente. Il codice di ritorno ptrShEx è 42 ma sembra che non sia nella lista dei possibili errori.


Qualcuno può aiutarmi?
Grazie
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Esecuzione di un file .BAT con parametro da una applicazione VO

Post by wriedmann »

Ciao Claudio,
una cosa fondamentale: un file bat o cmd non è un eseguibile, e neanche un documento. Perciò ShellExecute non può eseguirlo.
Un file bat o cmd è una sequenza di comandi che deve essere eseguito dall'interprete della riga di comandi.
Se vuoi allora eseguire un file bat o cmd devi eseguire l'interprete della riga di comandi "cmd.exe" e passargli il file bat come parametro, e inoltre devi usare il parametro /c:
cmd.exe /c SalvaDB.bat
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Esecuzione di un file .BAT con parametro da una applicazione VO

Post by claudiocarletta »

Grazie Wolfgang,
lo provo appena possibile e ti faccio sapere

Sempre prezioso, grazie
Claudio
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Esecuzione di un file .BAT con parametro da una applicazione VO

Post by claudiocarletta »

Ciao Wolfgang,
ho provato e riprovato ShellExecute() con parametro e con stringa unica ma non ne vuole sapere di eseguirmi il .BAT

Code: Select all

METHOD Salva( )
    LOCAL sNomeFile	AS STRING
    LOCAL sParam	AS STRING
    
    sNomeFile := "cmd.exe"
    sParam := "/C SalvaDB.bat " + DToS(Today()) + StrTran(Time(), ":")
    AttivaShellExecute(sNomeFile, sParam)
RETURN NIL
    
METHOD AttivaShellExecute(sNomeFile as STRING, sParam as STRING) 
	LOCAL ptrShEx			AS PTR				
	LOCAL sShEx				AS STRING				
	LOCAL lShEx := FALSE	AS LOGIC
	
	ptrShEx := ShellExecute(oApp:handle(), AsPsz("Open"), AsPsz(sNomeFile),  ;
				AsPsz(sParam), AsPsz(WorkDir()), SW_SHOWNORMAL)
	DO CASE
		CASE ptrShEx = 0	
e anche

Code: Select all

METHOD Salva( )
    LOCAL sNomeFile	AS STRING
    LOCAL sParam	AS STRING
    
    sNomeFile := "cmd.exe /C SalvaDB.bat " + DToS(Today()) + StrTran(Time(), ":")
    AttivaShellExecute(sNomeFile)
RETURN NIL
    
METHOD AttivaShellExecute(sNomeFile as STRING) 
	LOCAL ptrShEx			AS PTR				
	LOCAL sShEx				AS STRING				
	LOCAL lShEx := FALSE	AS LOGIC
	
	ptrShEx := ShellExecute(oApp:handle(), AsPsz("Open"), AsPsz(sNomeFile),  ;
				AsPsz(NULL), AsPsz(WorkDir()), SW_SHOWNORMAL)
	DO CASE
		CASE ptrShEx = 0	
Hai qualche suggerimento da propormi?
Claudio
stecosta66
Posts: 46
Joined: Mon Sep 26, 2016 12:59 pm

Esecuzione di un file .BAT con parametro da una applicazione VO

Post by stecosta66 »

Ciao Claudio,
hai provato a vedere il comando RUN di VO?
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Esecuzione di un file .BAT con parametro da una applicazione VO

Post by wriedmann »

Ciao Claudio,
purtroppo sono assente d'ora in poi.
Guardo appena possibile e ti faccio sapere.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
FFF
Posts: 1580
Joined: Fri Sep 25, 2015 4:52 pm
Location: Germany

Esecuzione di un file .BAT con parametro da una applicazione VO

Post by FFF »

Claudio,
non vedo nessuna classe nelle intestazioni dei metodi - è davvero VO?
Regards
Karl
(on Win8.1/64, Xide32 2.20, X#2.20.0.3)
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Esecuzione di un file .BAT con parametro da una applicazione VO [Risolto]

Post by claudiocarletta »

Ciao Stefano,
avevo completamente dimenticato il vecchio RUN di Clipper e quindi di VO
Funziona perfettamente.
Ho usato <oApp>:Run(<cCommand>) ---> liReturnNum che mi ritorna anche l'eventuale errore
Grazie a tutti
Post Reply