Einzelnen Beitrag anzeigen

frieder2008

Registriert seit: 28. Feb 2009
78 Beiträge
 
#1

Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 14:14
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)
  Mit Zitat antworten Zitat