mayho33
Goto Top

C-Sharp - EXE -ERROR in Installshield CustomAction wegen abschließendem Backslash aus INSTALLDIR

Hallo @ All

Ich verwende eine selbst erstellte C#-exe (Konsole) in einer Installshield CustomAction.
Die exe liegt in SupportFiles [SUPPORTDIR] und ich spreche sie in einer Type 34 CA (Path referencing a directory) im Deferred Execution -Modus an.

Der Aufruf schaut so aus:
"[SUPPORTDIR]\meine.exe" "[INSTALLDIR]" -install

exemplarisch ausgeschrieben:
"C:\Users\MeinUser\AppData\Local\Temp\{GUID}\meine.exe" "C:\ProgramFiles\Meine Fonts\" -install

Ich bekomme darauf hin einen Error in meiner Exe. Sie kann den gegebenen Pfad (INSTALLDIR) nicht verarbeiten kann.

Der Fehler liegt am abschließenden "\" (Backslash) im Pfad, den Installshield leider nur so bereit stellt. Die 2 Argumente "[INSTALLDIR]" und -install werden wegen des abschließenden Backslash als ein einziges Argument erkannt:

genau so: C:\ProgramFiles\Meine Fonts\" -install

Den Fehler fange ich meiner MSI derzeit so ab, dass ich die Files in einem SubFolder (Component) ablege und in der CA so aufrufe:
"[SUPPORTDIR]\meine.exe" "[INSTALLDIR]Fonts" -install

Das ist aber nur ein Workarround. face-wink

Nun meine Frage:

Wie kann ich das im meiner Exe abfangen sodass die 2 Argumente auch als 2 Argumente erkannt werden trotz des angehängten Backslash? Ich hoffe, dass sich das vor dem Verarbeiten der Args in der MAIN schon abfangen lässt und nicht erst durch umständliches Aufdröseln in der MAIN.

Bin dankbar für jeden Hinweis!

Grüße!

Mayho

Content-Key: 560810

Url: https://administrator.de/contentid/560810

Printed on: April 25, 2024 at 10:04 o'clock

Member: SlainteMhath
SlainteMhath Mar 25, 2020 at 14:06:47 (UTC)
Goto Top
Moin,

was hintert dich in deiner Anwendung daran zu prüfen ob ein \ am Schluss steht und diesen dann ggfs. zu entfernen bevor du den Pfad verwendest?

lg,
Slainte
Member: mayho33
mayho33 Mar 25, 2020 at 14:44:51 (UTC)
Goto Top
Zitat von @SlainteMhath:

Moin,

was hintert dich in deiner Anwendung daran zu prüfen ob ein \ am Schluss steht und diesen dann ggfs. zu entfernen bevor du den Pfad verwendest?

Hi,

Ja genau der Umstand, dass die Arguments schon verarbeitet worden sind bevor sie in void Main(string args) angekommen sind.

Dann würde mir nur noch bleiben die Argumente aufzudröseln, quasi manuell zu trennen und wieder so zusammenzufügen, dass das ganze Sinn ergibt.

Will ich aber nicht. Wie ich oben schon geschrieben habe, suche ich nach einer Möglichkeit die Args vor der Verarbeitung zu korrigieren. Also wenn der String daher kommt und noch als solcher vorhanden ist.

Grüße!
Mitglied: 143127
143127 Mar 25, 2020 updated at 14:56:10 (UTC)
Goto Top
Zusätzlichen Backslash hinzufügen sollte reichen, dann ist das Anführungszeichen nicht mehr escaped und die Argumente sollten wieder einzeln übergeben werden.
"[SUPPORTDIR]\meine.exe" "[INSTALLDIR]\" -install
Member: mayho33
mayho33 Mar 25, 2020 at 15:29:30 (UTC)
Goto Top
Zitat von @143127:

Zusätzlichen Backslash hinzufügen sollte reichen, dann ist das Anführungszeichen nicht mehr escaped und die Argumente sollten wieder einzeln übergeben werden.
"[SUPPORTDIR]\meine.exe" "[INSTALLDIR]\" -install


Danke @143127 !

Vereinfacht die Sache zwar ungemein in der CA, aber irgendwie knabbere ich doch noch am Code der Exe. Muss doch möglich sein das Escapen des fehlerhaften Arguments abzufangen ohne die Args zu bearbeiten...oder nicht?

Ich würde es halt gerne wasserdicht haben. Ich bin nicht der einzige bei uns der MSIs bastelt.

Danke!
Mitglied: 143127
143127 Mar 25, 2020 updated at 16:56:41 (UTC)
Goto Top
Zitat von @mayho33:
Vereinfacht die Sache zwar ungemein in der CA, aber irgendwie knabbere ich doch noch am Code der Exe. Muss doch möglich sein das Escapen des fehlerhaften Arguments abzufangen ohne die Args zu bearbeiten...oder nicht?
Ich würde es halt gerne wasserdicht haben. Ich bin nicht der einzige bei uns der MSIs bastelt.
Dann stütze dich eben nicht auf das args Array sondern Parse den kompletten Argumente-String als ganzes via Regex mit Submatches, mach ich öfter so. Dann ist es egal ob die Argumente als ein einziges oder als mehrere Elemente vorliegen, dann ist das auch wasserdicht, "wenn" dein Regex es auch ist face-wink.