Leerzeichen veruracht Fehler

15. Februar 2007 12:46

Hallo,

wir haben in unserem Kassenprogramm eine Codeunit, die einen Shell-Befehle ausführt und somit unsere Kassenschublade öffnet. Es wird also eine Datei ausgeführt, die parametergesteuert die Schublade öffnet.
Nun haben wir unser System von 3.6 auf 4.03 upgedatet und seitdem funktioniert der Aufruf nicht mehr.

Der Aufruf sollte lauten: M:\Winnt\system32\kasse.com 4" wobei die zahl den entsprechenden Com-Port darstellt. Die Codeunit dazu sieht so aus:

Code:
IF NOT UserSetup.GET(USERID) THEN
  EXIT;
IF NOT POSData.GET(UserSetup."Responsibility Center",UserSetup.POS) THEN
  EXIT;
SHELL(POSData."POS open  Folder/Command");

SHELL('CMD.EXE /c M:\WINNT\system32\kasse.com 4');


Nun interpretiert das System das leerzeichen vor dem COM-Paramter als ungültiges Zeichen. Nehme ich es raus, funktioniert der Aufruf, aber natürlich wird kein Port angesteuert.

Gibt es hier eine Lösung?

Gruß,
Michael

15. Februar 2007 13:05

Die Shellaufrufe ab Version 4 sind geändert.
Die Lösung findest du vermutlich hier.

15. Februar 2007 13:21

Ich stand vor Kurzem vor genau demselben Problem.
Kowas Link enthält zwar schon die Lösung, hier aber nochmal meine:

Tatsächlich muss dein Link von doppelten Anführungsstrichen umgeben sein. Dies hat aber erst funktioniert, nachdem ich diese Anführungsstriche als Textvariable (die für Multilanguage-Vorgänge, nicht eine Variable vom Typ Text!) ausgelagert habe.

Also: Textvariable anlegen, z.B. als txtStriche, Inhalt: "
Shellaufruf korrigieren:
SHELL(txtStriche + Dateipfad + txtStriche)

15. Februar 2007 13:57

Nun, da die SHELL Aufrufe seit 4.00 IMO etwas unkomfortabel sind, empfehle ich statt dessen die Verwendung des "Windows Script Hosts":

Code:
Function "RunCommand(CommandString [Text1024])"
{ Local: WSH_Shell, Automation: "Windows Script Host Object Model".WshShell }
IF ISCLEAR(WSH_Shell) THEN
  CREATE(WSH_Shell);
WSH_Shell.Run(CommandString);

(Analog auch mit WSH_Shell.Exec verwendbar)

D.h. im obigen Fall könnte der Aufruf so aussehen:

Code:
IF NOT UserSetup.GET(USERID) THEN
  EXIT;
IF NOT POSData.GET(UserSetup."Responsibility Center",UserSetup.POS) THEN
  EXIT;
RunCommand(POSData."POS open  Folder/Command");

RunCommand('CMD.EXE /c M:\WINNT\system32\kasse.com 4');

15. Februar 2007 15:56

Vielen Dank für Eure Hilfe.

Ich hab mich mal mit beiden Vorschlägen beschäftigt und nutze jetzt den ersten Vorschlag. Funktioniert tadellos.
Schade nur, dass uns unser NSC nicht darauf hingewiesen hat, dass sich die SHELL-Aufrufe geändert haben.

Gruß,
Michael