Jump to content

Programm nur einmal starten


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo Board!

 

Ich habe eine doofe Nuss zu knacken, bei der ich alleine nicht weiterkomme.

 

Das Szenario:

In einem Netzwerk liegt auf dem Server (2K) in einem freigegebenen Ordner eine EXE.

Der Ordner ist bei den Usern (2K/XP) als Laufwerk (F:\) gemappt.

Auf dem Desktop der User liegt eine Verknüpfung zu dem Programm.

 

Das Starten des Programmes dauert mitunter etwas länger, da noch zig grosse Dateien nachgeladen werden und manchmal noch auf offene Dateien gewartet wird, gerade viel Traffic auf dem Netz ist, etc.

 

Die Folge:

User muss manchmal etwas länger warten als normal und klickt dann nochmal und nochmal und nochmal... (nach dem Motto: das MUSS doch irgendwann mal gehen...)

 

Das Problem:

Programm wird dann mehrere male geöffnet und PC schmiert ab. 1 Minute später klingelt mein Telefon...

 

Mein Lösungsansatz (?):

So, nun hab ich mir gedacht, ich bastel mal ´ne kleine Batch-Datei, die den mehrfachen Start abfängt (ist nur ein Beispiel mit Winword, aber im Prinzip das gleiche):

 

C:\WORD.BAT

 

@echo off

if exist c:\word.tmp goto raus

 

:ersterstart

copy c:\word.bat c:\word.tmp >nul

"c:\programme\microsoft office\office11\winword"

del c:\word.tmp

 

:raus

exit

 

Funktioniert ja auch. Aaaaaber:

Es wird eine DOS-Box geöffnet, das ist 1. unschön und 2. fehlerträchtig. Schließt der User die DOS-Box VOR dem eigentlichen Programm ("in dem Fenster passiert ja überhaupt nichts, das kann ich doch schliessen..."), wird die Temp-Datei nicht entfernt und er kann das Programm überhaupt nicht mehr starten. 1 Minute später klingelt mein Telefon...

 

Hat jemand ´ne Idee???? Außer Telefon abstellen :D??? Darf auch gerne ganz was anderes sein als Batch.

 

Liebe Grüße,

Fusselchen

Link zu diesem Kommentar

Geiler Tip, jetzt muss ich nur noch VB lernen ;)

 

OK, ich habe das jetzt ganz quick und ganz dirty so gut ich kann zusammengeklatscht:

 

set fs = CreateObject("Scripting.FileSystemObject")

 

if fs.fileExists("c:\btg_act.tmp") then

msgbox ("Programm wurde bereits gestartet")

else

set fs = createobject("Scripting.filesystemobject")

set logbuch = fs.opentextfile("c:\btg_act.tmp", 2, true,0)

logbuch.writeline now & ": gestartet"

logbuch.close

 

set wshell = CreateObject("Wscript.shell")

wshell.run """c:\programme\microsoft office\office11\winword"""

 

set fso = CreateObject("Scripting.FileSystemObject")

set f1 = fso.GetFile("c:\btg_act.tmp")

f1.Delete

 

end if

 

Und wie schaffe ich es, daß das Script wartet, bis die Winword.exe geschlossen wird, bevor es weitermacht?

 

Liebe Grüße,

Fusselchen

Link zu diesem Kommentar

Ist das ein Programm, das ihr selbst entwickelt habt ? Da gibts ganz schöne Möglichkeiten das im Sourcecode abzufangen...

 

Alternativ könntest du eine kleine Anwendung machen, die abfragt, ob im System bereits ein Prozess mit dem Namen des auszuführenden Prozesses vorhanden ist. Wenn ja kommt dann die Meldung dass der Prozess schon läuft, wenn nicht wird das Programm gestartet....

Link zu diesem Kommentar

Hallo,

 

probiers mal damit: ;)

 

checktasks.vbs

Option Explicit
Stop
On error Resume Next
'==================
'Declarations
'==================
Dim user,domain
Dim wshShell
Dim strUserName
Dim loc
Dim svc
Dim proc_list
Dim proc
Dim ret
Dim oArgs
Dim Program
Dim Target
Dim Start
'==================
'Main Body
'==================
Set oArgs =WScript.Arguments
set loc = createObject("WbemScripting.SWbemLocator")
Set wshShell = CreateObject("Wscript.Shell")
Program = oArgs(0)
Target = oArgs(1)
strUserName = wshShell.ExpandEnvironmentStrings("%Username%")
loc.security_.impersonationLevel = 3 'impersonate
set svc = loc.connectServer(".","root\cimv2")
set proc_list = svc.ExecQuery("Select * from Win32_Process")
for each proc in proc_list
ret = proc.GetOwner(user,domain)
if ret <> 0 then
 'wscript.echo "Error executing GetOwner for process " & proc.Name & " ,Error value = " & ret
Else
	'If proc.name = Program then
If UCase(proc.name) = UCase(Program) then
 		If strUserName = user then
		WScript.Echo "Hallo " & user & " !" & vbCrLf & "Das Programm " & Program & " läuft bereits !" & vbCrLf & "Bitte noch etwas Geduld !"
 			WScript.quit
 		End If
 	End If

end if
next

start = WshShell.run(Target)

 

Aufruf:

checktasks.vbs notepad.exe %SystemRoot%\system32\notepad.exe

Link zu diesem Kommentar

Is gar nicht kompliziert:

 

lad dir mal die Pstools von Sysinternals runter.

Da drin gibts ein tool pslist.exe.

 

Das wenn du aufrufst mit "pslist -e prozessname" dann bekommst du als Ausgabe wenn der Prozess nicht gestartet ist eine ausgabe in der enthalten ist "was not found on".

 

du kannst also so was in der art machen:

 

Pseudocode:

 

if ( pslist -e prozessname entählt "was not found on")

--> Programm starten

else

--> Meldung dass Programm schon startet

 

Is aber nur eine von vielen Möglichkeiten

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...