Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 Uhr.
Seite 1 von 2  1 2      

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