Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Pfad richtig Escapen (https://www.delphipraxis.net/169923-pfad-richtig-escapen.html)

pustekuchen 21. Aug 2012 14:16

Pfad richtig Escapen
 
Hallo,

ich möchte gerne per ShellExecute einen Datei mit parametern ausführen.

Delphi-Quellcode:
var
  parameter: PWideChar;
begin
  parameter := PWideChar('/K ^"%ProgramFiles(x86)%\PostgreSQL\9.1\bin\createuser^" -s -U postgres test');
  ShellExecute(0, nil,'cmd.exe',parameter ,nil,SW_SHOW);
Fehlermeldung:
Code:
Der Befehl ""C:\Program" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Was mach ich hier falsch? Wie Escape ich richtig?

Gruß
pustekuchen

Luckie 21. Aug 2012 14:27

AW: Pfad richtig Escapen
 
Ich glaube nicht, dass Shellexecute die Umgebungsvariable auflösen kann.

pustekuchen 21. Aug 2012 14:30

AW: Pfad richtig Escapen
 
Soll es ja auch nicht. Das soll ja die cmd.exe dann machen, was sie ja anscheinend auch tut.
Auch wird das erste ^" richtig convertiert. Jedoch scheint das zweite " zu fehlen..

Zitat:

Der Befehl ""C:\Program"

himitsu 21. Aug 2012 14:31

AW: Pfad richtig Escapen
 
Zitat:

Zitat von pustekuchen (Beitrag 1179048)
Wie Escape ich richtig?

Das sollte in
Delphi-Quellcode:
cmd /?
erwähnt werden.
Aber so ganz durchgesehn hab ich da auch noch nicht.

Zitat:

Zitat von Luckie (Beitrag 1179049)
Ich glaube nicht, dass Shellexecute die Umgebungsvariable auflösen kann.

Delphi-Quellcode:
%ProgramFiles(x86)%\
wurde zu
Delphi-Quellcode:
C:\Program...
. :wink:

pustekuchen 21. Aug 2012 14:56

AW: Pfad richtig Escapen
 
In der Hilfe der cmd konnte ich zum escaping nichts finden. Lediglich zum /K parameter:
Code:
Wird /C oder /K angegeben, wird der Rest der Befehlszeile nach der Option als
Befehlszeile verarbeitet, wobei folgende Logik zur Verarbeitung des doppelten
Anführungszeichens (") gilt:

    1. Sind alle folgenden Bedingungen erfüllt, wird ein doppeltes
        Anführungszeichen auf der Befehlszeile beibehalten:

        - keine Option "/S"
        - genau zwei doppelte Anführungszeichen
        - keines der folgenden Zeichen zwischen den doppelten
          Anführungszeichen: &<>()@^|
        - es ist mindestens ein Leerzeichen zwischen den doppelten
          Anführungszeichen
        - die Zeichenfolge zwischen den doppelten Anführungszeichen ist der
          Name einer ausführbaren Datei

    2. Ist dies nicht der Fall, wird bei einem doppelten Anführungszeichen
        als erstem Zeichen sowohl dieses, als auch das letzte doppelte
        Anführungszeichen entfernt (und der Rest der Befehlszeile bei-
        behalten).
Und diese Bedingungen erfülle ich ja.

DeddyH 21. Aug 2012 15:05

AW: Pfad richtig Escapen
 
Zitat:

"%ProgramFiles(x86)%\PostgreSQL\9.1\bin\createuser ^"
enthält aber kein Leerzeichen. Wenn also die Anführungszeichen deshalb entfernt werden und erst danach die Variable aufgelöst wird, hast Du ein Problem. Da würde ich mir eher die Mühe machen, den Pfad selbst zu ermitteln und dann alles zusammen zu escapen.

pustekuchen 21. Aug 2012 15:17

AW: Pfad richtig Escapen
 
Dann müsste es ja mit dieser Zeile klappen:
Delphi-Quellcode:
parameter := PWideChar('/K ^"C:\Program Files (x86)\PostgreSQL\9.1\bin\createuser^" -s -U postgres test');
Dort ist nun ein Leerzeichen vorhanden. Jedoch erscheint der gleiche Fehler.

DeddyH 21. Aug 2012 15:22

AW: Pfad richtig Escapen
 
Wozu dienen denn die "^"?

pustekuchen 21. Aug 2012 15:24

AW: Pfad richtig Escapen
 
Zum Escapen. Siehe Hier unter Escape Character
(War mir ebenfalls nicht bekannt.)

DeddyH 21. Aug 2012 15:27

AW: Pfad richtig Escapen
 
Da steht aber nichts davon, dass man Anführungszeichen escapen soll. Lass die ^ doch mal testhalber weg.

himitsu 21. Aug 2012 15:44

AW: Pfad richtig Escapen
 
Du sagst damit ja, daß dieses " ein "Zeichen" sein soll, so wie ein "A", aber das soll es ja nicht sein. :angle:

Dalai 21. Aug 2012 17:33

AW: Pfad richtig Escapen
 
Anführungszeichen werden in Batch gar nicht escaped sondern verdoppelt (oder vervierfacht). Escapen muss man nur Pipe (|), Umleitungen (< und >) sowie Befehlsgruppierungen (& und &&) und ggf. Klammern (welche ebenfalls der Befehlsgruppierung dienen).

Davon abgesehen frage ich mich aber noch, warum du die EXE nicht direkt ausführst. Das geht doch einfacher als der Umweg über CMD, oder nicht?

Ergänzung: Zur Expandierung von Umgebungsvariablen nutze ich diese Funktion:
Delphi-Quellcode:
function ExpandEnvStr(const sInput: string): string;
const
  MAXSIZE = 32768; // laut PSDK sind 32k das Maximum
begin
  SetLength(Result, MAXSIZE);
  SetLength(Result,
            ExpandEnvironmentStrings(PChar(sInput), @Result[1], Length(Result))-1);
            //-1 um abschließendes #0 zu verwerfen
end;
Die wird aber wahrscheinlich nicht mit WideStrings/Unicode funktionieren, schätze ich (ich weiß es nicht, weil ich bisher keine Notwendigkeit hatte, meine Programme darauf anzupassen und/oder zu testen).

MfG Dalai

Luckie 21. Aug 2012 17:36

AW: Pfad richtig Escapen
 
Wer rechnet denn schon damit, dass man mit Shellexecute den Kommandoprozessor aufruft, um ein Programm auszuführen. Das ist ja von hinten durch die Brust ins Auge.

pustekuchen 22. Aug 2012 06:37

AW: Pfad richtig Escapen
 
Zitat:

Zitat von Luckie (Beitrag 1179116)
Wer rechnet denn schon damit, dass man mit Shellexecute den Kommandoprozessor aufruft, um ein Programm auszuführen. Das ist ja von hinten durch die Brust ins Auge.

Da hast du natürlich recht.War gestern anscheinend zu spät :P

Und dieser Thread hat mich dann durcheinander gebracht.

Zitat:

Zitat von DeddyH (Beitrag 1179071)
Da steht aber nichts davon, dass man Anführungszeichen escapen soll. Lass die ^ doch mal testhalber weg.

Ohne gings ;)
Mit diesem Pfad
Delphi-Quellcode:
parameter := PWideChar('/K "C:\Program Files (x86)\PostgreSQL\9.1\bin\createuser" -s -U postgres test');


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz