![]() |
Probleme mit kurzen und langen Dateinamen / Übergabe
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. :wall: 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) |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
*.bat - wird durch den alten MSDOS 5.0 kompatiblen COMMAND.COM interpretiert.
*.cmd - wird durch neue Cmd.exe interpretiert Ich würde es mal mit einer cmd-Batchdatei versuchen. |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Aber das ändert doch nichts an dem Problem, dass die Übergabe der Datein von Delphi -> Bat nicht funktioniert, oder?!?
danke & gruß, frieder |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Zitat:
COMMAND.COM kann mit langen Dateinamen nicht umgehen; Cmd.exe dagegen schon. Also statt BAT-Dateien einfach mal CMD-Dateien verwenden. Öffne mal eine Eingabeaufforderung und gehe in ein Verzeichnis, dass lange Datei/Pfadnamen enthält. Dann starte COMMAND.COM. Du siehst wie sich das Prompt verändert.
Code:
C:\Users\Guest>cd "Saved Games"
C:\Users\Guest\Saved Games>command Microsoft(R) Windows DOS (C)Copyright Microsoft Corp 1990-2001. C:\USERS\GUEST\SAVEDG~1> |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Er ruft ja nicht Command.com auf, sondern eine BAT-Datei. Denke es wird dann automatisch CMD zur Behandlung gestartet.
Folgender BAT-Datei funktioniert bei mir mit Übergabe der Textdatei: Das ist eine Datei mit langem Dateinamen.txt
Code:
Angezeigt wird "Das ist eine Datei mit langem Dateinamen.txt" und Notepad korrekt gestartet.
@echo off
cls echo %1 pause notepad %1 btw:
Delphi-Quellcode:
Bei mir klappts...
// Params sollte außerhalb wie folgt vorbereitet werden:
Params := '"' + Param1 + '" "' + Param2 + '"'; // in ExecAndWait Result := CreateProcess(PChar(FileName), PChar(Params), |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Wie wäre es denn, vorher mit
![]() |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Ich nutze auch "GetShortPathName", um dann Batchfiles zu starten. Klappt einwandfrei. Mit kurzen Dateinamen sollte jedes Programm umgehen können, mit langen nicht immer.
|
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Danke für die Antworten, aber ich bekomms nicht hin:
Folgendes hab ich (u.a.) versucht, sowohl mit als auch ohne getshortpathname; "" als extra Params hat auch nicht gefunzt:
Delphi-Quellcode:
Et jeht nich! :evil: Nicht einmal die Batchdatei wird gestartet..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 + '"'; FillChar(SUInfo, SizeOf(SUInfo), #0); with SUInfo do begin cb := SizeOf(SUInfo); dwFlags := STARTF_USESHOWWINDOW; wShowWindow := WindowState; end; Result := CreateProcess(PChar(CmdLine), PChar(params), 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; //Button: Execandwait(shortfilename('c:\treetagger\bin\CCCGraph.bat'),'"C:\TreeTagger\BIN\test.txt" "C:\treetagger\bin\tagged_test.txt"',sw_normal); @Satty: Hast Du was anderes gemacht, als ich hier jetzt?!? gruß, frieder EDIT: Mit
Delphi-Quellcode:
wird zwar die Bat gestartet, aber die Params offenbar nicht korrekt übertragen.. :wall:
shellexecute(0, 'open', pchar('c:\treetagger\bin\CCCGraph.bat'), '"C:\TreeTagger\BIN\test.txt" "C:\treetagger\bin\tagged_test.txt"', nil, SW_NORMAL);
|
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Ja, anders...
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 // Du muss jeden Parameter einzeln in " einschließen >> CmdLine := '"' + Params + '"'; // DAs klappt nicht, weil beide Parameter innerhalb " " FillChar(SUInfo, SizeOf(SUInfo), #0); with SUInfo do begin cb := SizeOf(SUInfo); dwFlags := STARTF_USESHOWWINDOW; wShowWindow := WindowState; end; // vvvvvvvvvvvvvv Result := CreateProcess(PChar(Filename), PChar(params), 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; |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
ich sehe immer den gleichen Fehler!
Jeder Parameter muss einzeln in " " eingeschlossen werden, nicht die ganze CommandLine rufe wie folgt auf:
Delphi-Quellcode:
Filename: Nur der BAT-Dateiname, sonst nichts!
CreateProcess(PChar(Filename), PChar(params),
Params: zusammengesetzte Parameterliste = "Param1" "Param2" Die Empfehlung ShortFileName zu verwenden, ist auch nicht ganz unwichtig. Könnte auch sein, das die Parameterliste sonst zu lang wird... keine Ahnung ob es da eine Grenze gibt... unter DOS gab es eine. |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Ja, das habe ich auch verstanden; aber die Parameter einzeln in "" habe ich doch:
Delphi-Quellcode:
Oder bin ich blind?
Execandwait(shortfilename('c:\treetagger\bin\CCCGraph.bat'),'"C:\TreeTagger\BIN\test.txt" "C:\treetagger\bin\tagged_test.txt"',sw_normal);
Danke für Deine Geduld.. :oops: Ach ja: und es gibt eine Begrenzung: 255 Zeichen.. |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Ja, Dein EDIT hatte ich übersehen.
Kannst ja mal die Parameterübergabe mit einer Debug-Bat testen:
Code:
wenn Du ExecAndWait aufrufst:
@echo off
cls echo Parameterliste: echo %1 echo %2 echo %3 echo %4 echo %5 echo %6 echo %7 echo %8 echo %9 pause
Delphi-Quellcode:
und innerhalb ExecAndWait wieder an den Strings rumbastelst und statt FileName CmdLine nimmst, dann funktioniert das nicht.
Execandwait(shortfilename('c:\treetagger\bin\CCCGraph.bat'),'"C:\TreeTagger\BIN\test.txt" "C:\treetagger\bin\tagged_test.txt"',sw_normal);
|
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Probiers mal so (Copy&Paste bitte... Funtion ist mit der 2 anders benannt)
Delphi-Quellcode:
Aufruf dann:
function ExecAndWait2(const Filename, Param1, Param2: string; WindowState: word): boolean;
var SUInfo: TStartupInfo; ProcInfo: TProcessInformation; CmdLine: string; begin // Parameterliste CmdLine := '"' + Param1 + '" "' + Param2 + '"'; FillChar(SUInfo, SizeOf(SUInfo), #0); with SUInfo do begin cb := SizeOf(SUInfo); dwFlags := STARTF_USESHOWWINDOW; wShowWindow := WindowState; end; // vvvvvvvvvvvvvv Result := CreateProcess(PChar(Filename), 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;
Delphi-Quellcode:
€: Hatte jetzt selber ein Fehler drin ;)
ExecAndWait2(shortfilename('c:\treetagger\bin\CCCGraph.bat'),'C:\TreeTagger\BIN\test.txt','C:\treetagger\bin\tagged_test.txt',sw_normal);
PS: normalerweise gehört natürlich CmdLine außerhalb zusammengebaut und als ein Params übergeben, damit ExecAndWait universell bleibt. |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Danke, Fehler hatte ich bemerkt. Ok, jetzt wird die Batch gestartet. Aber selbst wenn ich in die Batch nur die Parameter testweise abfrage, kommt nichts. Die "pause" wird gar nicht bearbeitet. Vielmehr scheint - keine Ahnung von wem oder was - der Vorgang sofort wieder abgebrochen zu werden.
Mit der Shellexecute-Version wird die Batch ebenso aufgerufen und die Parameter korrekt übergeben. Wenn ich aber im Anschluss an diese Params-Test-Lines den eigentlichen Aufruf starte, wird die Batch abgebrochen und das Cmd-Fenster sofort geschlossen, so dass ich nicht einmal kontrollieren kann, woran es eigentlich liegt?! Das ist der Inhalt der Batch-Datei (testweise).
Code:
Seltsam seltsam.. Kann ich evtl. das automatische Fensterschließen verhindern?
@echo off
cls echo Parameterliste: echo %1 echo %2 echo %3 echo %4 echo %5 echo %6 echo %7 echo %8 echo %9 pause // Soweit hat alles gefunzt; hier aber bricht er jetzt ab. set TAGDIR=C:\Treetagger 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 pause EDIT: Wenn ich die Zeile c:\treetagger\bin\CCCGraph.bat','C:\TreeTagger\BIN \test.txt', 'C:\treetagger\bin\tagged_test.txt direkt im CMD eingebe, läuft die Batch einwandfrei. Es muss also an der Schnittstelle von Delphi und CMD liegen.. |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Also hab' mir CreateProcess mal in der OH angesehen. Dein erster Ansatz war richtig, nur die Paramerterübergabe falsch.
Bei mir war Parameterübergabe richtig, aber die Bedeutung AppName / CommandLine falsch gedeutet. Hier nochmal:
Delphi-Quellcode:
Alles an CmdLine übergeben war also OK, Nur die " waren an der falschen Stelle gesetzt. Probier es bitte nochmal mit der Funktion oben.
function ExecAndWait2(const Filename, Param1, Param2: string; WindowState: word): boolean;
var SUInfo: TStartupInfo; ProcInfo: TProcessInformation; CmdLine: string; begin // Parameterliste CmdLine := Filename +' "' + Param1 + '" "' + Param2 + '"'; 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; |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Hey, super, ich hab schon verzweifelt. Jetzt klappts! Da scheiden sich eben die Profis von den Möchtegernprofis, also meiner Wenigkeit. :)
Wenn Du in der Nähe wärst, würd' ich Dir en Bier ausgeben! :-D Vielen Dank für Deine Geduld und noch schönen Abend, frieder aus Heidelberg |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Moin frieder2008,
lass' mal das @echo off weg, und dann setze hinter jede verdächtige Zeile mal eine Pause. Der SET-Block müsste auch noch problemlos abgearbeitet werden. Ausserdem solltest Du mal ausprobieren, was passiert, wenn Du Parameter mit Umlauten übergibst, da die Konsole einen anderen Zeichensatz verwendet als die übrigen Programme. Wenn Du also in Delphi einen Pfad mit Umlauten hast, der dort korrekt angezeigt wird, wird dieser in der Konsole ungültig sein. |
Re: Probleme mit kurzen und langen Dateinamen / Übergabe
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz