PDA

Ver la Versión Completa : ejecutar ap.ext. dir. y nombre in & outfile


jonydread
14-11-2011, 02:16:22
algo enredado el titulo pero trate de ser algo especifico y no lo pude editar despues,
lo que pasa ejecuto programa externo que convierte archivo segun estos parametros en un bat
set WORKFILE=%~1
set OUTFILE=%~dpn1.inf
CD /D %~dp1

:doit
Echo.
Echo ** Converting "%~nx1" ...
reg2inf.exe "%WORKFILE%" "%OUTFILE%"
Echo.
PAUSE
goto end
queria saber si se puede hacer lo mismo en codigo delphi
algo asi como un shellexecute que tome el archivo de entrada %WORKFILE% y salga con %OUTFILE%
tengo solo una parte mas o menos clara
%WORKFILE% podria ponerlo como Opendialog1.FileName o ParamStr(1)
pero
%OUTFILE% ??? debe tener otra extension (en bat set OUTFILE=%~dpn1.inf) y quedar en el mismo directorio de workfile en (bat CD /D %~dp1)
demas no se bien como realizar esta parte, mas bien estoy bien nulo
reg2inf.exe "%WORKFILE%" "%OUTFILE%"

saludos!
Gracias!

ecfisa
14-11-2011, 14:24:31
Hola.

No entiendo la necesidad de enviar los parámetros al archivo por lotes, yo lo haría directamente a reg2inf. Por ejemplo:

procedure LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string; const Destino: string);
begin
ShellExecute(Hnd,
'OPEN',
PChar(ExtractFileName(App)),
Pchar(Origen+' '+Destino),
PChar(ExtractFilePath(App)),
SW_HIDE);
end;


Llamada:

LlamarReg2inf(Handle,'C:\REG2INF.EXE','C:\TEMP\OLDNAME.XX','C:\TEMP\NEWNAME.XXX');


Saludos.

jonydread
14-11-2011, 14:51:21
lo que pasa es que reg2inf.exe es un programa externo, es un archivo comprimido funciona con pantalla msdos y no puedo editarlo, para ello existe otro bat que envia los parametros que coloque, lo que quiero es saltar el primero y hacerlo en delphi y enviar directo a reg2inf.exe

jonydread
14-11-2011, 15:50:45
funciona bien pero como puedo reemplazar esto
,'C:\TEMP\NEWNAME.XXX' mantener nombre de archivo y crear en el mismo directorio de entrada
edit:
ay quedo

procedure Tform1.LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string; const Destino: string);
var sAppName, sAppinf : string;
begin
sAppName := App;
sAppinf := ChangeFileExt(sAppName,'.inf');
ShellExecute(Hnd,
'OPEN',
PChar(ExtractFileName(App)),
Pchar(Origen+' '+Destino),
PChar(ExtractFilePath(App)),
SW_HIDE);
end;

muchas gracias!!

jonydread
14-11-2011, 16:22:49
disculpa el de arriba estaba mal no funciona

ecfisa
14-11-2011, 16:24:22
Hola jonydread.

Podés enviar constantes como en el ejemplo que te puse anteriormente o variables. Lo que importa es que en el argumento Origen envíes la Ruta+Nombre de archivo sobre el que se van a hacer las operaciones (WORKFILE) y en el argumento Destino el nombre que deseas darle a la salida (OUTFILE).

Un ejemplo con variables:

var
Aplicacion ,Entrada, Salida:
begin
Aplicacion:= 'Y:\UNA_RUTA\REG2INF.EXE'; // Aplicacion: reg2inf.exe
Entrada := 'X:\OTRA_RUTA\ENTRADA.@@@'; // Nombre de archivo de entrada
Salida := 'X:\OTRA_RUTA\SALIDA.UXO'; // Nombre de archivo de salida
LlamarReg2Inf(Handle, Aplicacion, Entrada, Salida);
...


Saludos.

jonydread
14-11-2011, 16:42:49
Mil gracias tenia la solucion ay mismo y no me habia dado cuenta

procedure Tform1.LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string; const Destino: string);
begin
ShellExecute(Hnd,
'OPEN',
PChar(ExtractFileName(App)),
Pchar(Origen+' '+Destino),
PChar(ExtractFilePath(App)),
SW_HIDE);
end;
llamar LlamarReg2inf

procedure TForm1.Button2Click(Sender: TObject);
var sAppName, sAppnew : string;
begin
sAppName := Opendialog1.FileName;
sAppnew := ChangeFileExt(sAppName,'.inf');
LlamarReg2inf(Handle,'REG2INF.EXE',Opendialog1.FileName,sAppnew );
end;

jonydread
16-11-2011, 04:39:59
Amigo tengo dos dudas para este codigo
1ºComo puedo aplicar el shortname para las rutas conservando el nombre del archivo ya que lo aplique de este modo

var Origen, Destino,FileName : string;
begin
FileName := ExtractFileName(Opendialog1.filename);
Origen := GetshortName(Opendialog1.FileName);
Destino := ChangeFileExt(ExtractFileName(FileName),'.inf');
LlamarReg2inf(Handle,'REG2INF.EXE',Origen,Destino );
end;
me entrega bien pero si el nombre de archivo tiene espacio no hace nada por ejemplo
mi archivo.xx
pero si esta asi
miarchivo.xx funciona ok
2ºAplico HINSTANCE pero no me da resultado la coloque en Tform1.LlamarReg2inf
para que responda a errores y sepa cuando el resultado fue exitoso
gracias por tu tiempo

ecfisa
16-11-2011, 12:32:46
Como puedo aplicar el shortname para las rutas conservando el nombre del archivo

Si no te entendí mál, sería:

var
Origen, Destino: string;
begin
OpenDialog1.Execute;
Origen := GetshortName(Opendialog1.FileName);
Destino := ExtractFilePath(Opendialog1.FileName) + ChangeFileExt(ExtractFileName(Opendialog1.FileName), '.INF');
...


Un saludo.

jonydread
16-11-2011, 15:11:22
asi coloque para que funcionara

Origen := GetshortName(Opendialog1.FileName);
Destino :=ChangeFileExt(ExtractFileName(Opendialog1.FileName), '.inf');
funciona pero si el nombre contiene espacios no funciona

lo otro disculpa
para colocar un HINSTANCE donde lo coloco??

gracias!!

ecfisa
16-11-2011, 15:32:46
si el nombre contiene espacios no funciona
Tenés razón, eso me pasa por hacer las cosas en el aire. :o

De este modo renombra correctamente el archivo usando nombres cortos (con y sin espacios):

...
var
Origen, Destino: string;
begin
OpenDialog1.Execute;
Origen := GetshortName(Opendialog1.FileName);
Destino := GetShortName(ChangeFileExt(Origen, '.INF'));
ShowMessage(Origen+#10#13+Destino); // las cadenas sólo difieren en '.INF'
...


Saludos.

jonydread
16-11-2011, 15:51:55
Tenés razón, eso me pasa por hacer las cosas en el aire. :o

De este modo renombra correctamente el archivo usando nombres cortos (con y sin espacios):

...
var
Origen, Destino: string;
begin
OpenDialog1.Execute;
Origen := GetshortName(Opendialog1.FileName);
Destino := GetShortName(ChangeFileExt(Origen, '.INF'));
ShowMessage(Origen+#10#13+Destino); // las cadenas sólo difieren en '.INF'
...


Saludos.
Disculpas creo que me exprese mal, funciona bien lo que pasa que el nombre del archivo si tiene espacios no realiza la accion, estoy buscando como reemplazar el espacio por _ para que pueda escribir el archivo de salida

ecfisa
16-11-2011, 16:19:57
estoy buscando como reemplazar el espacio por _ para que pueda escribir el archivo de salida


uses StrUtils;
...
var
ArchivoSalida: string;
begin
...
ArchivoSalida:= AnsiReplaceStr(ArchivoSalida, ' ', '_');
...
end;


Saludos.

jonydread
16-11-2011, 16:45:39
lo he hecho asi
procedure TReg2infConverter.Button2Click(Sender: TObject);
var Origen, Destino,FileName: string;
begin
Origen := GetshortName(Opendialog1.FileName);
Destino :=ChangeFileExt(FileName, '.inf');
FileName := ExtractFileName(Opendialog1.FileName);
FileName := StringReplace(FileName,' ','_',[rfReplaceAll]);
LlamarReg2inf(Handle,'REG2INF.EXE',Origen,Destino );
end;

es la única forma que realiza la acción pero el archivo de salida sale sin nombre .inf solamente
para que quede mas claro
este archivo esta en esta ruta
D:\Documents and Settings\Administrador\Mis documentos\pruebas\Copia de arch.reg (con este da el problema)
D:\Documents and Settings\Administrador\Mis documentos\pruebas\Copiadearch.reg (este realiza la acción y conserva el nombre completo)

ecfisa
16-11-2011, 17:20:30
D:\Documents and Settings\Administrador\Mis documentos\pruebas\Copia de arch.reg (con este da el problema)
D:\Documents and Settings\Administrador\Mis documentos\pruebas\Copiadearch.reg (este realiza la acción y conserva el nombre completo)

Entonces:

use StrUtils;
...
ArchivoSalida:= AnsiReplaceStr(ArchivoSalida,' ','');


Pero entonces no se condice con lo que expusiste en el mensaje anterior: "estoy buscando como reemplazar el espacio por _ ..." ;)

Un saludo. :)

jonydread
16-11-2011, 18:11:06
es lo mismo por lo que se reemplaze pero el enredo lo tenia yo jaj gracias ay funciono de pelos!!
procedure TReg2infConverter.Button2Click(Sender: TObject);
var Origen, Destino,FileName: string;
begin
FileName := Extractfilename(Opendialog1.FileName);
Origen := GetshortName(Opendialog1.FileName);
FileName:= AnsiReplaceStr(FileName,' ','');
Destino :=ChangeFileExt(FileName, '.inf');
LlamarReg2inf(Handle,'REG2INF.EXE',Origen,Destino );
end;
la otra consulta que ise puse el codigo hintance para comprobar shellexecute
lo coloque aqui
procedure TReg2infConverter.LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string; const Destino: string);
var
HINSTANCE: Integer;
ErrorMSG: string;
begin
HINSTANCE:=ShellExecute(Hnd,
'OPEN',
PChar(ExtractFileName(App)),
PChar(Origen+' '+Destino),
PChar(GetShortName(ExtractFilePath(App))),
SW_HIDE);
if HINSTANCE < 32 then
begin
case HINSTANCE of
0: ErrorMSG:= 'Memoria o recursos insuficientes';
ERROR_FILE_NOT_FOUND: ErrorMSG:= 'Archivo no encontrado';
ERROR_PATH_NOT_FOUND: ErrorMSG:= 'Ruta no encontrada';
SE_ERR_ACCESSDENIED: ErrorMSG:= 'Acceso denegado';
//...
end;
MessageBox(Handle, PChar(ErrorMSG), 'ERROR', MB_ICONERROR + MB_OK);
Application.Terminate;
end;
end;
pero no funciono

ecfisa
16-11-2011, 18:24:55
Hola.

¿ Que es lo que no funcionó, no ejecuta el programa , te da alguna excepción ?

Saludos.

jonydread
16-11-2011, 18:42:05
ise la prueba cargando un archivo y le cambie el nombre y no tira el error de no encontrado

ecfisa
16-11-2011, 19:11:41
Hola.

La función ShellExecute no te va a informar ningún error si la ruta y el nombre de archivo enviado en el argumento App es correcto.

Es taréa de la aplicación invocada por ShellExecute el manejar cualquier error en los nombres enviados en los parámetros Origen o Destino.


Un saludo.

jonydread
16-11-2011, 19:12:12
ok muchas gracias!

ecfisa
16-11-2011, 19:20:25
Hola.

Estaba pensando, que si los archivos son elegidos mediante un TOpenDialog, existen pocas posibilidades de que el archivo no exista...

Es decir o cancela la elección o la acepta, pero si hace esto último, si o sí el nombre de archivo se encontrará en la propiedad FileName del TOpenDialog. Y a menos que el archivo se halle en una unidad removible y sea quitada antes de llamar a ShellExecute no veo la posibilidad de que el archivo desaparezca.

De todas formas podés utilizar la función FileExists antes de llamar a ShellExecute para verificar la existencia el archivo enviado en el argumento Origen.

Saludos.

jonydread
16-11-2011, 19:50:11
lo ise asi
if FileExists(Opendialog1.FileName) then
label1.Caption:='Convertido con exito!! : '+outfile
else
label1.Caption:='Error! No se Encuentra Archivo'
end;

gracias!!