Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

CMD öffnen, offen halten und befehl übergeben

Frage Entwicklung VB for Applications

Mitglied: SvenGuenter

SvenGuenter (Level 1) - Jetzt verbinden

16.01.2008, aktualisiert 17.01.2008, 25456 Aufrufe, 9 Kommentare

Hallo foglendes Problem.
Ich will aus einem VB6 Programm eine shell öffnen einen befehl schon vorgeben aber noch NICHT absenden. Sprich der User soll noch möglichkeiten zum editieren haben.

Ich habe schon was gemacht aber leider schließt sich die cmd sofort wieder wenn ich diese mit

SHELL programm,vbnormalsize

anspreche

in programm ist der String hinterlegt. Als Beispiel "echo C:\Programme\Verzeichnis\programm.exe"

Der exe kann aber noch ein oder mehrere Parameter übergeben werden, weswegen diese nicht gestaret werden soll.
Gibt es da einen Schalter den ich setzen muss oder wie mach ich das am besten?


Gruß

Sven
Mitglied: bastla
16.01.2008 um 11:56 Uhr
Hallo SvenGuenter!

Warum nicht dem Benutzer eine InputBox anbieten und dann die vollständige Parameter-Zeile an den Batch übergeben?

Eine etwas abenteuerliche Variante könntest Du über "SendKeys" versuchen.
Wenn Du das CMD-Fenster (bis zur Ausführung eines "exit"-Befehles - egal ob durch Benutzereingabe oder per Batch) offen halten willst, dann mit "cmd /k" aufrufen - dazu kannst Du auch gleich einen (sofort auszuführenden) Befehl angeben, etwa
01.
objShell.Run "cmd /k cd /d D:\Test"
Grüße
bastla
Bitte warten ..
Mitglied: SvenGuenter
16.01.2008 um 12:07 Uhr
problem ist das die cmd sich schließt auch wenn sie offen bleiben soll.

z.B muss bei einer *.exe im nachhinein noch ein passwort eingegeben werden, was ich aber nicht mit dem ersten string erledigen kann.

Ich habe das ja auch so gemacht. Sprich textfeld welches ich auslese und dann der shell übergebe was ich halt nicht hinbekomme das das Dosfenster aufbleibt nachdem der befehl abgesetzt wurde.
Bitte warten ..
Mitglied: SvenGuenter
16.01.2008 um 12:12 Uhr
Hallo SvenGuenter!

Warum nicht dem Benutzer eine InputBox
anbieten und dann die vollständige
Parameter-Zeile an den Batch übergeben?

Eine etwas abenteuerliche Variante
könntest Du über
"SendKeys" versuchen.
Wenn Du das CMD-Fenster (bis zur
Ausführung eines
"exit"-Befehles - egal ob durch
Benutzereingabe oder per Batch) offen halten
willst, dann mit "cmd /k" aufrufen
- dazu kannst Du auch gleich einen (sofort
auszuführenden) Befehl angeben, etwa
01.
objShell.Run "cmd /k cd /d 
02.
> D:\Test" 
03.
> 
Grüße
bastla

das objshell referentierst du worauf?
Bitte warten ..
Mitglied: bastla
16.01.2008 um 12:20 Uhr
Hallo SvenGuenter!

Sorry, war noch in VBScript - dort:
01.
Set objShell = WScript.CreateObject("WScript.Shell")
In VB6 genügt natürlich ein "Shell".

Grüße
bastla
Bitte warten ..
Mitglied: SvenGuenter
16.01.2008 um 12:31 Uhr
super das geht schonmal einwandfrei und wie übergebe ich nun an die cmd einfach nur einen befehl ohne das dieser ausgeführt wird. Oder einfach nur Zeichen?
Bitte warten ..
Mitglied: bastla
16.01.2008 um 14:17 Uhr
Hallo SvenGuenter!

... wie übergebe ich nun an die cmd einfach nur einen befehl ohne das dieser ausgeführt wird
Abgesehen vom oben erwähnten "SendKeys" eigentlich gar nicht ...

... wobei ich mir nicht sicher bin, dass die angestrebte Vorgangsweise nötig ist - immerhin kennt Batch ja zumindest eine Input-Möglichkeit über
01.
set /p "Eingabe=Parameter angeben: " 
02.
echo Eingegeben wurde: %Eingabe%
Grüße
bastla
Bitte warten ..
Mitglied: SvenGuenter
16.01.2008 um 15:44 Uhr
Hi Ich bekomme die Motten.

Also ich habe folgendes verscuht

Versuch 1.
01.
Option Explicit 
02.
Public befehlshilfe As String 
03.
Private Declare Function WriteConsole Lib "kernel32" Alias _ 
04.
        "WriteConsoleA" (ByVal hConsoleOutput As Long, ByVal _ 
05.
        lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, _ 
06.
        ByRef lpNumberOfCharsWritten As Long, lpReserved As Long) As Long 
07.
         
08.
 
09.
Private Declare Function AllocConsole Lib "kernel32" () As Long 
10.
Private Declare Function FreeConsole Lib "kernel32" () As Long 
11.
Private Const STD_OUTPUT_HANDLE As Long = -11& 
12.
Private hConsoleIn As Long 
13.
Private hConsoleOut As Long 
14.
Private hConsoleErr As Long 
15.
Private Declare Function GetStdHandle Lib "kernel32" _ 
16.
        (ByVal nStdHandle As Long) As Long 
17.
Private Declare Function sleep Lib "kernel32" (ByVal dwMilliseconds&) 
18.
 
19.
 
20.
'****************************************************************** 
21.
'Klickereignis und dann soll es passieren 
22.
'****************************************************************** 
23.
Private Sub button_programmstarten_Click() 
24.
 
25.
    Call AllocConsole 
26.
     
27.
    shell "C:\Programm.exe" , vbnormalfocus 
28.
     
29.
    hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE) 
30.
    Call ConsolePrint("Hallo, wer immer Du auch bist!" & vbCrLf) 
31.
 
32.
 
33.
Me.button_cancel.Caption = "Beenden" 
34.
End Sub 
35.
 
36.
Private Sub ConsolePrint(szOut As String) 
37.
    Dim BytesWritten As Long 
38.
     
39.
    Call WriteConsole(hConsoleOut, szOut, Len(szOut), BytesWritten, 0&) 
40.
End Sub 
41.
 
42.
 
43.
 
erfolg? Nein er macht ein neues cmd auf und schreibt mir da schön den text rein.
Also ich nicht dumm und nciht faul sendkeys angeschaut und folgendes gebastelt

01.
'****************************************************************** 
02.
'Klickereignis und dann soll es passieren 
03.
'****************************************************************** 
04.
 
05.
Private Sub button_programmstarten_Click() 
06.
Dim programm As String 
07.
Dim progid 
08.
 
09.
 
10.
programm = Me.txtcommand 
11.
progid = Shell(programm, vbNormalFocus) 
12.
'****************************************************************** 
13.
'Schleife damit Progid auch sicher gefüllt ist 
14.
'****************************************************************** 
15.
 
16.
Do 
17.
If progid <> 0 Then Exit Do 
18.
sleep (50) 
19.
Loop 
20.
'****************************************************************** 
21.
'Cmdfnester als aktive App setzen 
22.
'****************************************************************** 
23.
 
24.
AppActivate progid, 1 
25.
'****************************************************************** 
26.
'Zu sendende Zeichen 
27.
'****************************************************************** 
28.
 
29.
SendKeys "abc", 1 
30.
Me.button_cancel.Caption = "Beenden" 
31.
End Sub 
32.
'****************************************************************** 
33.
'^Benötigte globale function sleep im allgemeinen Teil declariert 
34.
'****************************************************************** 
35.
Private Declare Function sleep Lib "kernel32" (ByVal dwMilliseconds&) 
36.
 


Tja auch das Funktioniert nicht. Bin mit meinem Latein langsam am ende. Wenn ich bei der shell das Programm mitgebe wird das Programm gestartet und bei appactivate steigt das programm aus weil ich angeblich die prozedur falsch aufrufe oder ein fehlerhaftes argument habe.

Ich hoffe es kann mir einer helfen.


edit
Kleine kuriosität. Ich habe eine Messagebox eingebaut das ich sehe welche progid ich habe. Wenn ich diese direkt nach dem erscheinen wegklicke bekommt meine Dosbox den SendKey. WEnn ich diese msgbox wegnehme bekomme ich einen Fehler bei AppActivate
Bitte warten ..
Mitglied: bastla
16.01.2008 um 18:57 Uhr
Hallo SvenGuenter!

Es fällt mir weiterhin schwer, die Notwendigkeit der von Dir angedachten Vorgangsweise zu erkennen. Sieh Dir vielleicht einmal den folgenden Versuch mit einem Startbatch und einem, das Programm simulierenden, weiteren Batch an - in beiden Batchdateien wird dem Benutzer die Möglichkeit gegeben, an der Konsole eine Eingabe zu tätigen, obwohl der erste Batch direkt (also ohne explizites Öffnen einer CMD-Shell) gestartet wird:

VB6
01.
Private Sub btnStart_Click() 
02.
Shell "D:\Starter.cmd Param1 Param2 ""Param 3"" Param4", vbNormalFocus 
03.
End Sub
Batch "D:\Starter.cmd"
01.
@echo off & setlocal 
02.
set /p "Zusatz=Weiterer Parameter (neben %*): " 
03.
D:\Prog.cmd %* "%Zusatz%" "und noch ein Parameter"
Batch "D:\Prog.cmd"
01.
@echo off & setlocal 
02.
echo. 
03.
echo Prog.cmd 
04.
echo Parameter waren: %1_%2_%3_%4_%5_%6_%7_%8_%9 
05.
echo. 
06.
echo bzw ohne Anfuehrungszeichen: 
07.
echo Parameter waren: %~1_%~2_%~3_%~4_%~5_%~6_%~7_%~8_%~9 
08.
echo. 
09.
set /p "Passwort=Bitte Passwort eingeben: " 
10.
echo Eingegebens Passwort: %Passwort% 
11.
echo. 
12.
pause
Sollte aus irgendeinem Grund das CMD-Fenster weiterhin benötigt werden, dann:
01.
Private Sub btnStart_Click() 
02.
Shell "cmd /k D:\Starter.cmd Param1 Param2 ""Param 3"" Param4", vbNormalFocus 
03.
End Sub
Grüße
bastla
Bitte warten ..
Mitglied: SvenGuenter
17.01.2008 um 11:05 Uhr
hi basta danke für deine Hilfe. Ich habe das jetzt erstmal anders geläst da ich das Programm fertig machen will und muss. Hintergrund ist folgender.

Es wird eine Datei ausgelesen die alle User mit Computernamen beinhaltet.

Falls ein User bei uns in der EDV anruft können wir nun diese Datei auslesen den Computernamen erfahren und mit den Sysinternal Tools auf den Rechner ( verbindung bekommt man auch wenn man will mit UltraVNC ) zugreifen.
Damit man nun nicht immer schauen muss welche Parameter der einzelne Befehl hat und wie er geschrieben wird habe ich ein Programm gebaut welches diese Befehle sucht und übernimmt. Mit einem Klick auf ein Datagrid bekommt man den Computernamen des users. Nun kommt der Teil mit der CMD
Der befehl den ich anklicke wird nun an die cmd gesendet und die cmd muss aufbleiben da es Tols gibt die sich immer wieder refreshen.
Nun war es aber so das den befehl den ich an die CMD gesendet habe via shell "cmd /K pslist.exe -s", vbnormalfocos als Beispiel, nicht in der CMD zur Verfügung hatte. Sprich die CMD hat diesen nicht gespeichert gehabt. Nun wollte ich das der Befehl einfach nochmal im CPROMPT steht. Dies wollte ich halt mit SendKeys oder ähnlichem sofort nach dem Befehl machen. Das klappte leider nicht. Nun habe ich das mit einem extra Button gemacht und da funktioniert das dann auch mit dem AppActivate. Irgendwie ist die CMD für eine gewisse Zeit für SendKeys nicht empfangsbereit.

Ist aber auch kein Problem da es so nun per Knopfdruck geht.

Falls ich mal eine Lösung finde das komplett Automiatisch zu machen werde ich das hier posten. Ich kann mir durchaus vorstellen das ich irgendwie den aktivitätsstatus der shell auslesen muss.


Gruß

Sven
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
IDE & Editoren
USB STICK Datei AUTOMATISCH beim anschliessen auf fremden PC öffnen (9)

Frage von Jwanner83 zum Thema IDE & Editoren ...

Batch & Shell
CMD cURL Access Token parsen (2)

Frage von maddig zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...