Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Starten einer Batch mit Shellexecute (https://www.delphipraxis.net/188421-starten-einer-batch-mit-shellexecute.html)

snt1965 2. Mär 2016 08:19

Starten einer Batch mit Shellexecute
 
Hallo zusammen!

Ich habe ein Problem beim Starten einer Batch mit Shellexecute.
So sieht der Code aus:

Delphi-Quellcode:
procedure Open_Devcon;
var PioEA,Pio_ein,Pio_aus,Devcon_path:string;
begin
  PioEA:='c:\Users\TF\Delphi\Devcon\WDK7.1.0\DisEnPIO.bat';

  showmessage(IntToStr(shellExecute(0,
         'open',
         'cmd',
         'PChar(PioEA)',
         nil,
         SW_SHOW)));

  {  showmessage(IntToStr(shellExecute(0,
         'runas',
         'PWideChar(PioEA)',
         nil,
         nil,
         SW_SHOW)));
 }
Wie man sieht, habe ich es mit zwei Varianten getestet (eine ist gerade auskommentiert).
Die gerade aktive Variante mit 'CMD' öffnet das CMD-Fenster, führt aber die Batch nicht aus. Shellexecute gibt hier eine 42 zurück.

Interessanter Nebeneffekt:
Gebe ich im noch offenen CMD-Fenster, das aus Delphi gestartet wurde, die Befehle der Batch bzw. die Batch selbst von Hand ein, wird das Programm aus der Batch bzw. die Batch nicht gefunden!
Öffne ich ein neues CMD-Fenster und mache das gleiche, funktioniert es!
Starte ich die Batch direkt oder über einen Link - funktioniert es.

Die auskommentierte Variante startet die Batch garnicht und Shellexecute gibt eine 2 zurück. Die Pfade stimmen aber - mehrfach geprüft.
Ich habe auch schon versucht, die Batch über einen Link zu starten. Hat aber auch nicht funktioniert.

Hier noch der Inhalt der Batch-Datei:
start /wait c:\Windows\System32\devcon disable USB\VID_09CA*
start /wait c:\Windows\System32\devcon enable USB\VID_09CA*

Die Batch startet über DEVCON ein USB-Device neu (was manchmal abstürzt, da es durch das Schalten großer Relais gestört wird).

Hat da jemand eine Idee dazu bzw. wie ich mein USB-Device per Software wieder aktivieren kann, ohne dass der Bediener etwas machen muss (soll im Hintergrund laufen)?

Danke!
Frank

Klaus01 2. Mär 2016 08:31

AW: Starten einer Batch mit Shellexecute
 
Vielleicht funktionier dies?

Delphi-Quellcode:
var
 shellExecuteInfo: TShellExecuteInfo;

filePath := 'c:\Users\TF\Delphi\Devcon\WDK7.1.0\'
parameter := '';

ZeroMemory(@shellExecuteInfo, SizeOf(TShellExecuteInfo));
shellExecuteInfo.cbSize := sizeOf(TShellExecuteInfo);
shellExecuteInfo.hwnd := 0;
shellExecuteInfo.lpVerb := 'open';
shellExecuteInfo.lpFile := pchar('DisEnPIO.bat');
shellExecuteInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
shellExecuteInfo.lpParameters := pChar(parameter);
shellExecuteInfo.lpDirectory := pChar(filePath);
shellExecuteInfo.nShow := SW_HIDE;
if not shellExecuteEx(@shellExecuteInfo) then
  showMessage(IntToStr(getLastError));
Grüße
Klaus

Neutral General 2. Mär 2016 08:32

AW: Starten einer Batch mit Shellexecute
 
ShellExecuteEx ist dafür nicht nötig.
Aber das PChar(PioEA) sollte wohl eher kein String sein (Die Anführungszeichen müssen weg)

bra 2. Mär 2016 09:00

AW: Starten einer Batch mit Shellexecute
 
Handelt es sich dabei um einen Windows 2008-Server? Bei dem funktioniert in der Aufgabenplanung das direkte Starten einer Batch nicht, dort muss man die cmd.exe mit der Batch als Parameter starten. Dürfte bei Windows 7 auch auftreten. Vielleicht funktioniert das für dich:

https://www.lexo.ch/blog/2012/04/sta...dmin-benutzer/

Neutral General 2. Mär 2016 09:05

AW: Starten einer Batch mit Shellexecute
 
Zitat:

Zitat von bra (Beitrag 1331852)
Handelt es sich dabei um einen Windows 2008-Server? Bei dem funktioniert in der Aufgabenplanung das direkte Starten einer Batch nicht, dort muss man die cmd.exe mit der Batch als Parameter starten. Dürfte bei Windows 7 auch auftreten.

Genau das tut er doch...

himitsu 2. Mär 2016 09:38

AW: Starten einer Batch mit Shellexecute
 
Warum kommt keiner auf die Idee das arme CMD mal zu fragen, warum es nicht will?

Ausführen > CMD >
Delphi-Quellcode:
CMD /?



PS: Mit sowas wie ShellExecuteAndWait (ShellExecuteEx) kann man devcon.exe auch direkt ausführen.
(wegen dem Warten, sonst auch direkt per ShellExecute ohne CMD oder Batch drumrum)

bra 2. Mär 2016 09:39

AW: Starten einer Batch mit Shellexecute
 
Da fehlt aber dann beim Parameter ein /c vor der Batch. Ansonsten geht nur eine cmd auf und tut nix. Kann man einfach auch so testen.

also:
Delphi-Quellcode:
PioEA:='/c c:\Users\TF\Delphi\Devcon\WDK7.1.0\DisEnPIO.bat';

Siehe auch hier: http://stackoverflow.com/questions/3...rameter-to-cmd

himitsu 2. Mär 2016 09:41

AW: Starten einer Batch mit Shellexecute
 
Zitat:

Zitat von Neutral General (Beitrag 1331854)
Dürfte bei Windows 7 auch auftreten.

Ich lass hier auf einem Win7-Rechner per Aufgabenplanung problemlos eine Batch ausführen, welche 'nen SVN aktulisiert.

Aber wenn es mit .bat Probleme gibt, dann nehmt einfach das (neuere) .cmd, mit selben Inhalt,
bzw. auf Windows Server auch gern mal mit PowerShell rumspielen. :angle:

bra 2. Mär 2016 09:44

AW: Starten einer Batch mit Shellexecute
 
Zitat:

Zitat von himitsu (Beitrag 1331859)
Ich lass hier auf einem Win7-Rechner per Aufgabenplanung problemlos eine Batch ausführen, welche 'nen SVN aktulisiert.

Ich weiss nur, dass dieses Problem bei Windows 2008 existiert. Per Aufruf über die CMD funktioniert es dort auch, muss man halt nur wissen ;)

himitsu 2. Mär 2016 10:42

AW: Starten einer Batch mit Shellexecute
 
Bei meinem Schlepptop ist irgendwann mal die Verknüpfung für .bat kaputt gegangen.
.bat werden im Notepad geöffnet, aber nicht ausgeführt ... k.A. was da paputt ist.

Doppelklick im Explorer und ShellExecute auf .bat, ohne CMD davor, gehen da auch nicht.

Bbommel 2. Mär 2016 10:45

AW: Starten einer Batch mit Shellexecute
 
Wenn du schreibst, dass du aus der durch Delphi geöffneten cmd heraus auch nicht auf die Batch zugreifen kannst, dann sieht das doch vielleicht nach einem Berechtigungsproblem aus. Läuft das Delphi-Programm vielleicht als anderer User, sodass das Problem mit der Tatsache, dass es eine Batch-Datei ist, eigentlich gar nichts zu tun hat?

Kannst du in dem cmd-Fenster, das durch dein Delphi-Programm geöffnet wurde, mit "cd" in das Verzeichnis wechseln?

Neutral General 2. Mär 2016 10:57

AW: Starten einer Batch mit Shellexecute
 
Zitat:

Zitat von Bbommel (Beitrag 1331871)
Wenn du schreibst, dass du aus der durch Delphi geöffneten cmd heraus auch nicht auf die Batch zugreifen kannst, dann sieht das doch vielleicht nach einem Berechtigungsproblem aus.

Vielleicht nerve ich etwas aber woher nehmt ihr diese alle diese Vermutungen? :roll:
Der erste offensichtliche Fehler, der 90% aller Theorien hier zumindest vorerst zunichte macht ist, dass er PChar(PioEA) beim Aufruf von Shellexecute in Anführungszeichen gesetzt hat:
Delphi-Quellcode:
shellExecute(0,
         'open',
         'cmd',
         'PChar(PioEA)', // <---------- !!
         nil,
         SW_SHOW)
Die einzige weitere sinnvolle Bemerkung war, dass er (wenn er die Datei indirekt über cmd ausführt, statt direkt die Batchdatei auszuführen) ein "/C" vor den Dateinamen der .bat setzen muss.
Alles andere ist (unbegründete) Spekulation oder Offtopic :roll:

Bbommel 2. Mär 2016 11:04

AW: Starten einer Batch mit Shellexecute
 
Meine Vermutung (die aber erst mal nur eine Frage war) nehme ich aus seiner Fehlerbeschreibung. Und ich nehme weiter an, dabei wird er seine Batchdatei nicht auch noch mit den Anführungszeichen aufgerufen haben. :)

snt1965 2. Mär 2016 11:46

AW: Starten einer Batch mit Shellexecute
 
Hallo zusammen,

danke für die Hinweise.
Das System ist Win7 prof. 64bit.

Ich habe bei PCHar die Anführungszeichen weggelassen. Hat aber auch nicht geholfen bzw. bei der Version mit 'runas' kommt nun:
"c:\windows\system32\devcon" konnte nicht gefunden werden. Stellen Sie sicher ... wiederholen Sie den Vorgang.
Devcon liegt aber im angegeben Pfad!!
Es ist wohl doch eher ein Rechteproblem von Win7 - aber wie kann man das lösen bzw. herausbekommen, ob es das ist?
Eigentlich sollte es gehen, da ich auf dem PC als Admin angemeldet bin.

Das mit /C vor CMD hatte ich auch schon versucht, hat aber nicht geholfen.

Ich werde als nächstes testen, DEVCON direkt über ShellexecuteEx zu starten.

himitsu 2. Mär 2016 11:50

AW: Starten einer Batch mit Shellexecute
 
Zitat:

Zitat von snt1965 (Beitrag 1331876)
Das mit /C vor CMD hatte ich auch schon versucht, hat aber nicht geholfen

Nach CMD, bzw. vor den Parameter/Dateinamen.

snt1965 2. Mär 2016 12:11

AW: Starten einer Batch mit Shellexecute
 
ja ist schon klar dass das /C nach CMD stehen muss
hatte ich auch so gemacht

einbeliebigername 2. Mär 2016 13:02

AW: Starten einer Batch mit Shellexecute
 
Hallo,

wegen dem "c:\windows\system32\devcon" konnte nicht gefunden werden, das kann auch ein 32/64bit-Problem sein. Wenn man cmd aus einem 32bit-Prozess heraus startet, bekommt man eine 32bitiges cmd. Aus einem 64bit-Prozess aber ein 64bitiges cmd. Der Inhalt von "c:\windows\system32" ist bei 32bit ein anderer als bei 64bit.

einbeliebigername.

snt1965 2. Mär 2016 13:17

AW: Starten einer Batch mit Shellexecute
 
Hallo zusammen,

Letztlich führte Folgendes zum Erfolg.
1. direkter Start von DEVCON über shellexecute
2. DEVCON in mein Userverzeichnis verschoben und von dort gestartet (vorher stand es unter c:\windows\system32 -- Rechteproblem??)

Danke und bis zum nächsten Mal in diesem tollem Forum!:-D
Frank

bra 2. Mär 2016 13:23

AW: Starten einer Batch mit Shellexecute
 
Zitat:

Zitat von snt1965 (Beitrag 1331881)
2. DEVCON in mein Userverzeichnis verschoben und von dort gestartet (vorher stand es unter c:\windows\system32 -- Rechteproblem??)

Wenn es ein 64-Bit-Windows und ein 32-Bit-Programm ist, hätte das vermutlich ins c:\windows\SysWOW64 gemusst. Unter Win64 ist das system32 das 64-Bit-Verzeichnis. Klingt blöd, ist aber so :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 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