Moin Leute,
ich sitze seit einiger Zeit an folgendem Problem:
Ich starte via CreateProcess eine Batch-Datei und übergebe ihr zwei Dateinamen, die ihrerseits wiederum mit dem nachfolgendem Code an ein Perl-Skript weitergegeben werden (etwas um die Ecke, geht aber grade nich anders). Mein Problem ist: Die Batchdatei startet zwar, übergibt die Dateinamen aber offenbar falsch. Warum?!? Habe es schon mit kurzen Dateinamen versucht, mit "" - hat aber alles nix geholfen.
Wenn ich das Batch-File via cmd starte und die Dateinamen in Kurzform ("C:\DOKUME~1\FRIEDE~1\EIGENE~1\Delphi\TAGGED~1\te st.TXT" "C:\DOKUME~1\FRIEDE~1\EIGENE~1\Delphi\TAGGED~1\TAG GED~1.200\tagged_test.TXT") dann klappt es ohne Probleme.
Ich will eigentlich einfach nur die Batchdatei mit zwei Parametern (als lange Windows-Dateinamen inkl. Leerzeichen) übergeben. Kann doch nicht so schwer sein. Dacht ich.
Dankbar für jeden Tipp!
Gruß, frieder
Delphi-Code:
Delphi-Quellcode:
function ExecAndWait(const Filename, Params: string;
WindowState: word): boolean;
var
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
begin
//Dateinamen in Anführungszeichen wg. langer Dateinamen mit Blanks
CmdLine := '"' + Filename + '"' + Params;
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WindowState;
end;
Result := CreateProcess(nil, PChar(CmdLine), nil, nil, FALSE,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo);
//Warten bis beendet
if Result then
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;
procedure TForm1.Button6Click(Sender: TObject);
var
par: string;
temp: tstringlist;
i: integer;
begin
if filelist.Items.count = 0 then exit;
if checkbox1.checked then
begin
createdir(filelist.directory + '\tagged_' + datetostr(date));
edit2.text:= (filelist.directory + '\tagged_' + datetostr(date));
end
else edit2.text:= filelist.directory;
for i:=0 to filelist.Items.count-1 do
begin
par:= '"' + shortfilename(filelist.directory + '\' + filelist.Items.Strings[i]) + '" "' + shortfilename(edit2.text) + '\tagged_' + filelist.items.strings[i] + '"';
memo3.lines.add(par);
Execandwait(extractfiledir(edit1.text) + '\CCCGraph.bat', par, sw_shownormal);
if fileexists(edit2.text + '\tagged_' + filelist.items.strings[i]) then memo3.Lines.add(edit2.text + '\tagged_' + filelist.items.strings[i])
else messagedlg('Achtung! Ein Fehler ist aufgetreten! Bitte prüfen Sie alle Einstellungen und Arbeitsvorraussetzungen (Ist Perl installiert?)', mterror, [mbok],0);
end;
if fileexists(extractfiledir(edit1.text) + '\CCCGraph.bat') then deletefile(extractfiledir(edit1.text) + '\CCCGraph.bat');
end;
Der Batch-Code:
Code:
@echo off
set TAGDIR=C:\DOKUME~1\FRIEDE~1\EIGENE~1\ARBEIT~1\TREETA~1
set BIN=%TAGDIR%\bin
set CMD=%TAGDIR%\cmd
set LIB=%TAGDIR%\lib
set TAGOPT=%LIB%\german.par -token -lemma -sgml -no-unknown
if "%2"=="" goto label1
perl %CMD%\tokenize.pl -a %LIB%\german-abbreviations %1 | %BIN%\tree-tagger %TAGOPT% > %2
goto end
:label1
if "%1"=="" goto label2
perl %CMD%\tokenize.pl -a %LIB%\german-abbreviations %1 | %BIN%\tree-tagger %TAGOPT%
goto end
:label2
echo.
echo Usage: tag-german file {file}
echo.
:end
EDIT:
Anders gefragt: Warum funktionier DAS nicht (mit obiger Funktion):
Delphi-Quellcode:
Execandwait('C:\Dokumente und Einstellungen\frieder\Eigene Dateien\Arbeit_GS\TreeTagger\bin\CCCGraph.bat',
'"C:\DOKUME~1\FRIEDE~1\EIGENE~1\Delphi\TAGGED~1\test.TXT" "C:\DOKUME~1\FRIEDE~1\EIGENE~1\Delphi\TAGGED~1\TAGGED~1.200\tagged_test.TXT"', sw_shownormal)