PDA

Ver la Versión Completa : Shellexecute con Parametros ...


ethangio
27-01-2012, 02:13:57
Buenas tardes a todos ..

He estado buscando en los hilos del foro y en google alguna solucion a mi problema. Les agradezco de antemano su ayuda.

Les comento que no me funciona la funcion shellexecute al pasarle parametros nada mas no crea mi backup no me da ningun error
este es mi codigo .


var
linea_mysqldump : String;
begin
linea_mysqldump := '/c "'+ExtractFilePath(Application.ExeName)+'Data\bin\mysqldump.exe" --opt --user=root --password=holaroot mibase > "'+ExtractFilePath(Application.ExeName)+'Backups\back.sql" ';
ShellExecute(handle,'open', 'cmd.exe', PChar(linea_mysqldump), nil, SW_HIDE);


Si cambio ExtractFilePath(Application.ExeName) por C:\archivos de programa\aplicacion\ si hace mi backup ...
Alguna solucion que conozcan ?

ecfisa
27-01-2012, 06:06:23
Hola ethangio.

¿ Revisaste que la función ExtractFilePath te esté devolviendo la cadena C:\archivos de programa\aplicacion\ ?

Si los valores son iguales y realiza la acción de una forma, tiene que realizarlo de la otra.

Para ver si el resultado de la composición de las cadenas es igual podés hacer, por ejemplo:

function ArmarCadena(const Cadena: string): string;
begin
Result:= '/c "' +
Cadena +
' Data\bin\mysqldump.exe" --opt --user=root --password=holaroot mibase > "' +
Cadena +
'Backups\back.sql" ';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(ArmarCadena(ExtractFilePath(Application.ExeName)));
Memo1.Lines.Add(ArmarCadena('C:\archivos de programa\aplicacion\'));
end;


Un saludo.

defcon1_es
27-01-2012, 12:22:22
Hola. Como dice ecfisa, debes asegurarte que la ruta es igual en ambos casos.


var linea_mysqldump, ruta : String;
begin
ruta := SysUtils.IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
showmessage(ruta);
linea_mysqldump := '/c "'+ruta+'Data\bin\mysqldump.exe" --opt --user=root --password=holaroot mibase > "'+ruta+'Backups\back.sql" ';
showmessage(linea_mysqldump);
ShellExecute(handle,'open', 'cmd.exe', PChar(linea_mysqldump), nil, SW_HIDE);


Si no funciona, usa el debug de Delphi y comprueba el valor de la variable ruta y el de la variable linea_mysqldump

ethangio
27-01-2012, 18:26:44
Gracias por sus comentarios .. Ya estuve checando como me dijeron y si es la misma ruta y todo ya lo cheque a detalle minusiosamente
y sigue igual, con las soluciones que me proporcionaron hace lo mismo ...

Conocen alguna manera de capturar el resultado del shellexecute al mandar el comando cmd con los parametros ?

por que yo pienso que en la funcion ExtractFilePath(Application.ExeName) hay algun caracter que causa que no se ejecute bien el comando a la hora de que se pasa como parametro a shellexecute PChar ... no se si me explique ...

Por que si ya lo hice ya cheque todo si escribo la ruta manual si hace bien el backup pero con la funcion ExtractFilePath(Application.ExeName) ya no ..

Seguiré buscando gracias

ethangio
27-01-2012, 23:00:29
Ya va funcionando ... cambie de
ExtractFilePath(Application.ExeName) a ExtractFileDir(Application.ExeName) pero ahora no se por que no me guarda el archivo en

c:\archivos de programa\aplicacion\backups\

Por que si creo el archivo en c:\ si lo crea

Seguire buscando

ethangio
28-01-2012, 00:25:56
Miren si yo pongo estas lineas si funciona


ruta := SysUtils.IncludeTrailingPathDelimiter(ExtractFileDir(Application.ExeName));

linea_mysqldump := '/c "'+trim(ruta)+'Data\bin\mysqldump.exe" --opt --user=root --password=holaroot mibase > C:\mibackup.sql';

ShellExecute(handle,'open', 'cmd.exe', PChar(linea_mysqldump), nil, SW_SHOWNORMAL);


Pero si pongo el sig codigo

ruta := SysUtils.IncludeTrailingPathDelimiter(ExtractFileDir(Application.ExeName));

linea_mysqldump := '/c "'+trim(ruta)+'Data\bin\mysqldump.exe" --opt --user=root --password=holaroot mibase > "'+trim(ruta)+'\Backups\mibackup.sql"';

ShellExecute(handle,'open', 'cmd.exe', PChar(linea_mysqldump), nil, SW_SHOWNORMAL);

Ya no hace el backup, y me manda un error en la ventana de DOS, que dice : "C:\Archivos" no se reconoce como un comando interno o externo, programa o archivo por lotes.

Entonces quiero pensar que tengo problemas con las comillas no ? pero no se como solucionarlo.

ecfisa
28-01-2012, 00:42:38
Hola ethangio.
Ya va funcionando ... cambie de ExtractFilePath(Application.ExeName) a ExtractFileDir(Application.ExeName)
Con ExtractFilePath obtenés: C:\Program Files\aplicacion\ y con ExtractFileDir: C:\Program Files\aplicacion. Por lo que pareciera que te estuviese sobrando un / en el primer caso.

Otra cosa que se me ocurre es que mysqldump.exe no maneje nombres largos (es sólo un lance ya que no conozco la aplicación), en cuyo caso podrías convertirlos a cortos antes de utilizarlos:

function GetShortName(const FileName:string): string;
var
ShortName: array[0..255] of char;
begin
GetShortPathName(PChar(FileName), @ShortName, Length(ShortName));
Result:= ShortName;
end;


Ejemplo de uso:

...
linea_mysqldump := '/c "' + GetShortName(ExtractFileDir(Application.ExeName)) + ...


Un saludo.

ethangio
28-01-2012, 01:16:50
Gracias .. gracias por su ayuda ...

ecfisa no utilice tu idea pero me diste otra buena ... Ya funciona :D


var
linea_mysqldump, ruta : String;
begin
ruta := SysUtils.IncludeTrailingPathDelimiter(ExtractFileDir(Application.ExeName));

linea_mysqldump := '/c "'+trim(ruta)+'Data\bin\mysqldump.exe" --opt --user=root --password=holaroot mibase > Backups\back.sql';

ShellExecute(handle,'open', 'cmd.exe', PChar(linea_mysqldump), PChar(ruta), SW_SHOWNORMAL);
end;


Les agradezco por su tiempo y ayuda ... ecfisa y defcon1_es ...