130834
Goto Top

Musik Subprozess (Batch)

Hey Leuts.

Ich hab mir natürlich wieder ein exquisites Problem für mich selbst herausgesucht an dem ich jetzt feststecke ... face-sad

Also ich hab 2 wichtige Dinge. Erstens ich hätt gern Musik im Hintergrund meiner Batch.
Das funkt recht gut, mit diesem Script hier:

@echo off
set "file=Sound.mp3"  
( echo Set Sound = CreateObject("WMPlayer.OCX.7"^)  
  echo Sound.URL = "%file%"  
  echo Sound.Controls.play
  echo do while Sound.currentmedia.duration = 0
  echo wscript.sleep 100
  echo loop
  echo wscript.sleep (int(Sound.currentmedia.duration^)+1^)*1000) >sound.vbs
timeout /t 2 /nobreak >nul
:loop
start "" /wait /min sound.vbs   
goto :loop

Erstes Problem: Ich weiss nicht wie ich diesen Erschaffenen Prozess töten kann somit läuft die Musik für immer, und ebenfalls habe ich ihn sogar nicht einmal im Taskmanager gefunden, was aber sowieso nicht wichtig ist, da ich ihn gern mit der einer anderen Batch beenden möchte, sobald ein bestimmtes Event eintritt. Und ich möchte auch nicht einfach den Loop beenden und dann warten bis die Musik aufhöhrt, da der Wechsel auf einen Schlag passieren soll.

Zweites Problem: (Nicht so wichtig) Ich habe eine Settings.bat welche einen SFX und Musik Regler hat. Nun, diese sind noch nicht besonders Nützlich, jedoch würde ich diese gern benutzen.
Das heisst soweit das ich wahrscheinlich für jeden SFX sound eine Batch wie oben habe welche dann mit einem Parameter einen SFX startet, aber ich habe keine Kontrolle über das Volumen. wüsste jemand wie ich für den erschaffenen Prozess ( oben ) das Volumen einstellen kann, und zwar nur für diesen da ich das Hauptvolume nicht berühren möchte? ( dies kann man ja auch in den normalen Windows Volumen Einstellungen )

Das alles sind natürlich Vorbereitungen für eine Art Videospiel womit ich grade am Rumprobieren bin, da ich keine Hobbies habe und die ganze Zeit am Batch schreiben bin ;)


TL;DR
Ich versuche ein Batch Game zu schreiben welches einen Musik und SFX controller und den Settings sowie Hintergrund Musik und Soundeffeckte im Spiel haben.
Die Settings existieren bereits jedoch ohne Kontrolle über das Volumen.

Content-Key: 318682

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

Ausgedruckt am: 19.03.2024 um 11:03 Uhr

Mitglied: H41mSh1C0R
H41mSh1C0R 21.10.2016 um 10:18:42 Uhr
Goto Top
hi,

was macht denn deine sound.vbs?

Irgend ein Process sollte schon generiert werden.
Ggf. eine Windows Media Player Instanz?

PID ermitteln und mit Taskkill abschiessen.

Gruß
Mitglied: 130834
130834 21.10.2016 um 10:29:21 Uhr
Goto Top
Danke, aber das bringt micht nicht sehr viel weiter.
Das mit taskkill wusste ich schon vorher.
Nur wie ermittle ich die PID eines Prozesses automatisch, Da dies ja vom Script und nicht dem User gemacht werden soll?
Mitglied: H41mSh1C0R
H41mSh1C0R 21.10.2016 um 10:32:46 Uhr
Goto Top
öööhhhmmm "Tasklist" ?????
Mitglied: 131223
131223 21.10.2016 aktualisiert um 10:39:30 Uhr
Goto Top
VBS laufen im Prozess cscript.exe oder wscript.exe einfach bei taskkill den imagename angeben oder mit tasklist filtern, fertig.

BTW. wer macht sowas heutzutage noch mit Batch?? Kopfschüttel. Wenn du kein Hobby hast hast du ja eigentlich genug Zeit zum Lernen einer richtigenProgrammiersprache.
Batch is wat fö ming Omma.
Mitglied: 130834
130834 21.10.2016 um 10:55:07 Uhr
Goto Top
Eher nicht, wenn du genauer lesen würdest. Tasklist zeigt eine Liste mit PIDs und Namen der Prozesse die am laufen sind.
Da dies ja vom Script und nicht dem User gemacht werden soll?
Daher ist Tasklist keine Lösung. Naja ich habs selber rausgefunden, mit Findstr könnte man die PID von wscript.exe herausfinden oder direkt töten, was aber auch alle anderen vbsscripts beenden würde. Vielleicht brauche ich jetzt eine Umfangreiche Abgleich Engine...
trotzdem danke das du es versucht hast.

Meine frage hat übrigens noch eine zweiten Teil.
Mitglied: 131223
131223 21.10.2016 aktualisiert um 11:10:46 Uhr
Goto Top
Laustärke in eine Datei schreiben und im VBS im Loop die Datei regelmäßig auslesen (FileSystemObject) und an den Player übergeben.

Daher ist Tasklist keine Lösung.
Doch
Taskkill für bestimmtes cmd Fenster
Natürlich per FOR-Schleife, die Kenntnisse setze ich hier bei einem Batchie voraus.
Mitglied: 77559
77559 22.10.2016 um 15:12:25 Uhr
Goto Top
Hallo clragon,
das [w|c]script zu killen macht keinen Sinn solange die Batchdatei noch läuft und das Script immer wieder mit neuer Pid startet.
Je nach Dauer der gewählten mp3 Datei wäre das dann Schritt 2.
Um die Batchdatei einfacher zu identifizieren würde ich ihr per Title einen aussagefähigen Namen verpassen und den per Tasklist /V filtern.

Da die Batchdatei aber ja immer noch ein sichtbares Fenster hat, wäre ein kleines Timeout /T 1 ohne /Nobreak vor dem goto :loop ja eine viel einfachere Lösung.

Gruß
LotPings
Mitglied: Friemler
Friemler 22.10.2016 um 18:26:48 Uhr
Goto Top
Hallo clragon,

die Zeile
Sound.Controls.play
legt doch nahe, dass das Media Player Scripting-Objekt eine Property Controls hat, über die die Steuerelemente des WMP (z.B. Play, Stop, usw.) zugänglich sind. Wozu dann Tasks abschießen?

Guckst Du hier.

Grüße
Friemler
Mitglied: 130834
130834 22.10.2016 um 21:14:13 Uhr
Goto Top
Danke! das ist mir eben gerade auch aufgellen...
jetzt hab ich das hier
Set Sound = CreateObject("WMPlayer.OCX.7")  
Sound.URL = "Distrust.mp3"  
nada = 1
do while nada = 1
wscript.sleep 100
Sound.Controls.play
wscript.sleep (int(Sound.currentmedia.duration)+1)*1000
loop
Sound.Controls.stop

wscript.sleep (int(Sound.currentmedia.duration)+1)*1000
Diese Zeile versteh ich noch nicht ganz, und ich müsste jetzt wissen wie ich nada von aussen aus auf 0 setzte, damit es stop. Das wäre perfekt.
ach ja. ich kann das aber sowieso alles wieder wegwerfen da ist keine Unterbrechungsfreie Wiedergabe ist.
Mitglied: rubberman
Lösung rubberman 22.10.2016 um 22:10:24 Uhr
Goto Top
Hallo clragon.

Diese Zeile versteh ich noch nicht ganz
Das duration-Member enthält die Länge deines mp3 Tracks in Sekunden mit Nachkommastellen. Sleep verlangt Millisekunden, darum wird 1 addiert, dann mit 1000 multipliziert und abgerundet.
und ich müsste jetzt wissen wie ich nada von aussen aus auf 0 setzte
In eine Datei schreiben und diese auslesen.

[OT]
Das alles sind natürlich Vorbereitungen für eine Art Videospiel womit ich grade am Rumprobieren bin
Wie du siehst, kannst du bereits das Audio nicht mit Batch regeln. Was glaubst du, passiert mit der Anzeige? Das Konsolefenster ist textbasiert. Grafik ist nicht, Vorder- oder Hintergrund ist nicht, den Cursor ohne 3rd Party irgendwo hinsetzen ist nicht, unterschiedliche Farben innerhalb eines Fensters ist ein Krampf, über Performance muss man sich keine Gedanken machen da sie nicht existiert.
Spiel mit Batch ist so etwas wie Sahnetorte mit Ketchup. Braucht keiner.
[/OT]

Grüße
rubberman
Mitglied: 130834
130834 22.10.2016 um 22:49:38 Uhr
Goto Top
Ja ich weiss. Deswegen sollte das auch mehr Story und Text und Entscheidung beinhalten als tatsächliches rumlaufen mit einem charakter oder einer GUI. Jedoch habe ich heute einen super umständlichen und langen Weg gefunden wie man tatsächlich eine Map erstellen könnte welche sogar Farben beinhaltet, und einen beweglichen Charakter sowie Reaktionen auf Felder.
Also ehrlich gesagt ist nur ne Idee bis jetzt. Und selbst wenn ich das Projekt in den Müll werfe, eine farbige funktionstüchtige Map baue ich vorher noch.
Mitglied: rubberman
Lösung rubberman 23.10.2016 aktualisiert um 14:49:06 Uhr
Goto Top
Hallo clragon.

OK, ich hab mal kurz ein Hybrid aus Batch und JScript zusammengeschraubt. (Das ist auch nichts anderes als Batch und VBScrip, nur dass beide Codes in derselben Datei liegen.)

@if (@a)==(@b) @end      /*********** Batch part ***********

@echo off &setlocal
set "settingfile=settings.txt" 

:: soundfile   - Pfad der Audiodatei
:: soundvolume - Lautstärke (0...100)
:: soundloop   - Audiodatei in Endlosschleife abspielen (0=nein, 1=ja)
:: soundplay   - 0=Pause, 1=Play
:: soundstop   - 0=Player laufen lassen, 1=Player und JScript beenden
set "soundfile=Sound.mp3" 
set /a "soundvolume=50,soundloop=1,soundplay=1,soundstop=0" 
>"%settingfile%" set sound 

start "" /b cscript //nologo //e:jscript "%~f0" "%settingfile%" 

>nul timeout /t 10
echo 2s Pause
set "soundplay=0" 
>"%settingfile%" set sound 
timeout /t 2
set "soundplay=1" 
>"%settingfile%" set sound 

>nul timeout /t 5
echo(&echo Volume 30
set "soundvolume=30" 
>"%settingfile%" set sound 

>nul timeout /t 5
echo(&echo Andere Datei
set "soundfile=Distrust.mp3" 
>"%settingfile%" set sound 

::>nul timeout /t 10
::echo(&echo Player stoppen und JScript beenden
::set "soundstop=1" 
::>"%settingfile%" set sound 

pause
exit /b

                          ********** JScript part **********/
var objService = WScript.CreateObject('WbemScripting.SWbemLocator').ConnectServer('.', 'root\\cimv2'),  
    objFSO = WScript.CreateObject('Scripting.FileSystemObject'),  
    objPlayer = WScript.CreateObject('WMPlayer.OCX.7'),  
    objFile, arrLine, strSoundfile;
objPlayer.settings.autoStart = true;
objPlayer.settings.mute = false;
objPlayer.settings.volume = 50;

while (true) {
  objFile = objFSO.OpenTextFile(WScript.Arguments(0), 1);
  while (!objFile.atEndOfStream) {
    arrLine = objFile.ReadLine().split('=');  
    if (arrLine.length > 1) {
      switch(arrLine) {
        case 'soundfile':  
          if (strSoundfile != arrLine[1]) {
            strSoundfile = arrLine[1];
            objPlayer.URL = strSoundfile;
          }
          break;
        case 'soundloop':  
          objPlayer.settings.setMode('loop', parseInt(arrLine[1]));  
          break;
        case 'soundplay':  
          if (parseInt(arrLine[1])) {
            objPlayer.controls.play();
          } else {
            objPlayer.controls.pause();
          }
          break;
        case 'soundstop':  
          if (parseInt(arrLine[1])) {
            objPlayer.close();
            WScript.Sleep(100);
            WScript.Quit();
          }
          break;
        case 'soundvolume':  
          objPlayer.settings.volume = parseInt(arrLine[1]);
          break;
      }
    }
  }
  objFile.Close();
  if (objService.ExecQuery('SELECT * FROM Win32_Process WHERE Name=\'cmd.exe\' AND CommandLine LIKE \'%"' + WScript.ScriptFullName.replace(/\\/g, '\\\\') + '"%\'').Count != 1) {  
    objPlayer.close();
    WScript.Sleep(100);
    WScript.Quit();
  }
  WScript.Sleep(500);
}

Wie's funktioniert:
- Die Datei wird einmal von cmd.exe als Batch und parallel von cscript.exe als JScript ausgeführt.
- Die erste Zeile ist valider Code in Batch und JScript und dient dazu einen JScript Kommentar einzuleiten.
- Alles zwischen /* und */ ist in JScript ein Kommentar und wird ignoriert.
- exit /b beendet den Batchprozess, alles was danach kommt wird nicht mehr gesehen.

- Im Batchcode hast du 5 Variablen (Erklärung im Code), die alle mit sound beginnen.
- Ein set sound listet alle Name=Wert Paare bei denen der Name mit sound beginnt, diese Wertepaare werden nach einem Update der Variablen in die Settingsdatei geschrieben.
- Der JScript Code liest diese Werte in einer Pollingschleife aus und nutzt sie entsprechend.

Natürlich kannst du auch mit einem anderen Script auf die Settingsdatei zugreifen, à la
@echo off &setlocal
set "settingfile=settings.txt"  

:: aktuelle Werte einlesen
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"  
:: bestimmten Wert ändern
set "soundvolume=70"  
:: Werte zurückschreiben
>"%settingfile%" set sound  
Aber Vorsicht, je mehr Prozesse auf die Datei zugreifen, desto größer die Gefahr, dass das gleichzeitig passiert, was zu Data Races führt.

Grüße
rubberman
Mitglied: 130834
130834 25.10.2016 um 22:48:07 Uhr
Goto Top
Oh mein gott.

rubberman, du bist irgendwie Wahsinnig ( Wahnsinnig toll, natürlich ). Genau wie es sein sollte!
Danke, das ist perfekt!! Das ist echt ne menge Code, und damit kann man sehr gut was anfange, vielen dank!
Okey es laggt etwas beim starten, ist aber egal, Ich hab schon eine Loading screen entwickelt der auf das laufen des Musik Prozesses wartet. Oh warte den kann ich jetzt wegwerfen da ich den Prozess nie mehr wider finde... hahaha! egal. trotzdem nochmal danke ich find gar keine Worte dafür.
Damit wäre ich meinem Videospiel was mir alle ausreden möchten einen schritt näher gekommen. Schade zwar das es nicht Unterbrechungsfrei ist, aber das war es ja noch nie. Ähm und irgendwie scheint es noch etwas unaufgeräumt, die Sound Settings hat keine Variable im JS Player weshalb man keinen effekt hat. Ich werds mal etwas umschreiben dann.

Btw; Ich hab ja das letzte mal noch von einem Map Drawer gesprochen. nun dieser funktioniert auch, wenn auch im Moment schrecklich ineffizient, und meine nächste Frage wird wahrscheinlich um das nächste Problem das ich darin habe gehen. Wenn es dich intressiert
Mitglied: rubberman
rubberman 26.10.2016 um 01:33:30 Uhr
Goto Top
Hallo clragon.

Sound Settings hat keine Variable im JS Player weshalb man keinen effekt hat.
Was meinst du? Den Dateiname der Settingsdatei? Der wird beim Aufruf von cscript übergeben und ist somit im JScript als WScript.Arguments(0) abgreifbar. (siehe Zeile 53 oben)

Ich hab ja das letzte mal noch von einem Map Drawer gesprochen
Der Kern des Scripts kommt mir sehr bekannt vor (bin Mod bei DosTips).

Grüße
rubberman
Mitglied: 130834
130834 29.10.2016 um 20:15:57 Uhr
Goto Top
Öhm... wollte heute in mein game implementieren das es die Musik startet beim Level start und wieder beendet.

Nur... Die musik startet nicht wenn ich den Player von einer anderen Batch aus starte. Nur wenn ich ihn als batch an sich starte.
Mitglied: rubberman
rubberman 30.10.2016 um 02:02:46 Uhr
Goto Top
Sorry, aber ich kann dir nicht folgen.

Also, die Batchdatei mit dem JScript Teil startet cscript.exe mit dem eigenen Dateinamen und rennt somit den Player.

Wie du von einem anderen Batchscript die Settingsdatei ändern kannst, habe ich dir gezeigt. Wenn du so etwas machst, musst du darauf achten, dass du die Variablen in jedem Script aktualisierst, bevor du sie änderst und zurückschreibst. Macht die Zeile
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"
Wenn du das nicht tust, nimmt ein anderes Script (z.B. das mit dem JScript) die in diesem Prozess gültigen Variablen und überschreibt Änderungen, die von einem anderen Prozessgemacht wurden.

Keine Ahnung, ob das dein Problem ist, das ist aber das einzige was ich dir so explizit nicht vorgekaut hatte.
Mitglied: 130834
130834 01.11.2016 aktualisiert um 18:06:02 Uhr
Goto Top
Das wusste ich schon. Ich meine die Main batch stellt die settings ein und startet dann die Music.bat aber die Musik startet nicht. Starte ich sie einfach so funktioniert es. Warum?
Mitglied: rubberman
rubberman 01.11.2016 um 19:57:04 Uhr
Goto Top
Der Fahrer setzt sich ins Auto, aber der Motor springt nicht an. Warum?
Weil der Zündschlüssel nicht steckt, weil die Batterie leer ist, weil die Sicherung durch ist, weil der Anlasser kaputt ist, weil kein Benzin im Tank ist, weil die Kolbenrückzugsfeder klemmt, ...

Wie wär's mal mit dem Code?
Mitglied: 130834
130834 02.11.2016 um 13:03:49 Uhr
Goto Top
:: start
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"  
set "soundvolume=70"  
>"%settingfile%" set sound  

start "%title%" "%cd%\sound\Music.bat"  

:: stop 
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"  
set "soundstop=1"  
>"%settingfile%" set sound  
Mitglied: rubberman
rubberman 02.11.2016 um 18:22:31 Uhr
Goto Top
START lässt Music.bat asynchron laufen. Das heißt, es wird nicht gewartet bis Music.bat beendet wird und das aufrufende Script wird weiter ausgeführt.

Folgendes passiert also:
- die Settings werden verändert
- Music.bat wird asynchron gestartet
- diese startet das JScript mit dem Player asynchron
- gleichzeitig wird soundstop vom ersten Prozess auf 1 gesetzt
- die Pollingschleife des JScripts liest diese neue Einstellung und beendet sich selbst
Mitglied: 130834
130834 03.11.2016 um 19:47:07 Uhr
Goto Top
verstehe. Wie umgehe ich das am besten? Ich möchte sie nicht ins Main script mit einbinden, das würde wahrscheinlich nicht so gut funktionieren. Ich könnte stattdessen eine andere batch starten welche Music.bat einfach in sich aufnimmt in dem sie nur den Namen aufruft.
Mitglied: rubberman
rubberman 03.11.2016 um 21:07:22 Uhr
Goto Top
Wenn ich wüsste, wie das gewünschte Verhalten aussehen soll ...

start "%title%" /wait "sound\Music.bat"
oder
start "%title%" /wait /b "sound\Music.bat"
oder
start "%title%" /d "sound" /wait /b "sound\Music.bat"
vielleicht?
Mitglied: 130834
130834 03.11.2016 um 21:27:57 Uhr
Goto Top
Unpraktisch ist: wenn ich auf sie warte, und sie läuft in einem loop, warte ich ewig.

Ich beschreib das mal hier: Das Spiel an sich sollte die Settings der Musik bat einstellen, Diese starten, und danach die erste stage in sich selbst laden. die Musik würde dann im Hintergrund in einem loop laufen laufen. Außerdem würde sie durch ein Zusatztool vor dem Spieler versteckt werden. ( weiss ich schon wie das funktioniert ) . Sobald die Stage vorüber ist, werden die Einstellungen einfach auf Musik Stop = 1 gesetzt und die Musik beendet sich selbst. Ich hatte auch geplant SFX einzubauen ( wie auch immer ) welche vielleicht über eine leicht abgeänderte Kopie der Musik bat laufen und halt keine Wiederholung haben. Die Stages sind im Moment Batches welche einfach in der Main gestartet werden, sollten aber später dann in-built sein. Sie sind nur zum debuggen extern gelagert.

Fals es dir weiterhilft kann ich das ganze Script hochladen, darin sind aber keine wichtigen Informationen gelagert.
Mitglied: rubberman
rubberman 03.11.2016 um 22:10:19 Uhr
Goto Top
Ich verstehe nur die Hälfte.
Du setzt soundstop=1, wenn du den Player beenden willst. Wenn du danach soundstop=0 setzt, fängt der nicht plötzlich wieder an zu rennen. Vermutlich willst du mit soundplay=0 auf Pause setzen?
Du musst auch nichts mit irgendwelchen Zusatztools verstecken. Music.bat braucht nichts auszugeben, darum kannst du ruhigen Gewissens mit START /B arbeiten. Dann rennen beide Prozesse mit nur einem Fenster. Wird dieses Fenster geschlossen, dann werden beide Prozesse beendet. Und da das JScript überwacht, ob Music.bat noch läuft, wird der Player somit auch beendet. Im Zweifelsfall brauchst du also die Einstellung soundstop=1 niemals.
Mitglied: 130834
130834 03.11.2016 um 22:23:55 Uhr
Goto Top
Hier: http://pastebin.com/7gwBuHG2
Dann gibt's weniger Missverstädnisse.
Bin mal im Bett gute Nacht face-smile
Mitglied: rubberman
rubberman 04.11.2016 um 00:41:45 Uhr
Goto Top
Dann gibt's weniger Missverstädnisse.
Wieso? Meinst du der Code rennt bei mir ohne die anderen Tools und Scripts, die dort eingebunden sind und deren Inhalt ich nicht kenne?

"Finding the smallest program that demonstrates the error" is a powerful debugging tool.<< [Bjarne Stroustrup, founder of C++]

Struktur:
│   main.bat
│   Room1.bat
│   Room2.bat
│   Settings.bat
│
└───sound
        Music.bat
        settings.txt
        test.mp3

main.bat
@echo off &setlocal enabledelayedexpansion enableextensions
set title=Testgame
Title %title%

set "settingfile=sound\settings.txt"  

echo(&echo rufe Settings.bat auf
call "Settings.bat"  

echo(&echo starte Music.bat
start "" /b cmd /c "%cd%\sound\Music.bat"  

echo(&echo rufe Room1.bat auf
call "Room1.bat"  

echo(&echo Music PAUSE
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"  
set "soundplay=0"  
set "soundfile=dummy.mp3"  
>"%settingfile%" set sound  

timeout /t 2

echo(&echo Music PLAY, ggf. Soundfile aendern (ich hab nur test.mp3, aber was soll's)  
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"  
set "soundplay=1"  
set "soundfile=test.mp3"  
>"%settingfile%" set sound  

echo(&echo rufe Room2.bat auf
call "Room2.bat"  

echo(&echo Music STOP
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"  
set "soundstop=1"  
>"%settingfile%" set sound  

pause

Room1.bat
echo *** I am Room1 ***
timeout /t 10

Room2.bat
echo *** I am Room2 ***
timeout /t 10

Settings.bat
if exist "%settingsfile%" for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"  
set "soundfile=test.mp3"  
set /a "soundvolume=50,soundloop=1,soundplay=1,soundstop=0"  
>"%settingfile%" set sound  

Music.bat
@if (@a)==(@b) @end      /*********** Batch part ***********

@echo off &setlocal

cd /d "%~dp0" 
set "settingfile=settings.txt" 
start "" /b /wait cscript //nologo //e:jscript "%~f0" "%settingfile%" 
exit /b

                          ********** JScript part **********/
var objService = WScript.CreateObject('WbemScripting.SWbemLocator').ConnectServer('.', 'root\\cimv2'),  
    objFSO = WScript.CreateObject('Scripting.FileSystemObject'),  
    objPlayer = WScript.CreateObject('WMPlayer.OCX.7'),  
    objFile, arrLine, strSoundfile;
objPlayer.settings.autoStart = true;
objPlayer.settings.mute = false;
objPlayer.settings.volume = 50;

while (true) {
  objFile = objFSO.OpenTextFile(WScript.Arguments(0), 1);
  while (!objFile.atEndOfStream) {
    arrLine = objFile.ReadLine().split('=');  
    if (arrLine.length > 1) {
      switch(arrLine) {
        case 'soundfile':  
          if (strSoundfile != arrLine[1]) {
            strSoundfile = arrLine[1];
            objPlayer.URL = strSoundfile;
          }
          break;
        case 'soundloop':  
          objPlayer.settings.setMode('loop', parseInt(arrLine[1]));  
          break;
        case 'soundplay':  
          if (parseInt(arrLine[1])) {
            objPlayer.controls.play();
          } else {
            objPlayer.controls.pause();
          }
          break;
        case 'soundstop':  
          if (parseInt(arrLine[1])) {
            objPlayer.close();
            WScript.Sleep(100);
            WScript.Quit();
          }
          break;
        case 'soundvolume':  
          objPlayer.settings.volume = parseInt(arrLine[1]);
          break;
      }
    }
  }
  objFile.Close();
  if (objService.ExecQuery('SELECT * FROM Win32_Process WHERE Name=\'cmd.exe\' AND CommandLine LIKE \'%"' + WScript.ScriptFullName.replace(/\\/g, '\\\\') + '"%\'').Count != 1) {  
    objPlayer.close();
    WScript.Sleep(100);
    WScript.Quit();
  }
  WScript.Sleep(500);
}
Mitglied: 130834
130834 09.11.2016 aktualisiert um 13:26:59 Uhr
Goto Top
Dann gibt's weniger Missverstädnisse.
Wieso? Meinst du der Code rennt bei mir ohne die anderen Tools und Scripts, die dort eingebunden sind und deren Inhalt ich nicht kenne?
"Finding the smallest program that demonstrates the error" is a powerful debugging tool. [Bjarne Stroustrup, founder of C++]


Deswegen:
Ich verstehe nur die Hälfte.
und Deswegen:
Wenn ich wüsste, wie das gewünschte Verhalten aussehen soll ...

Jetzt weißt du es ja. Außerdem hättest du dir ja einfach 3 Zeilen Code rausnehmen können und diese bearbeiten, da der Rest des Codes offensichtlich funktioniert und eher weniger mit dem Problem zu tun hat, Dann hättest du auch kein Problem mit den Zusatz-Dateien gehabt,
Diese sind nämlich genau dazu da, 1-Batch spezifische Fehler zu vermeiden, und eine unabhängige Umgebung zu schaffen. Ich habe dies auch bei dem oben beschriebenem Problem versucht.

Keine Ahnung, ob das dein Problem ist, das ist aber das einzige was ich dir so explizit nicht vorgekaut hatte.

Danke, ich wusste bereits wie sich dein Code verhält.
Ich finde es sehr nett das du hilfst, und du bist auch jemand bei dem auch wirklich eine Lösung herauskommt.
Aber ich möchte nicht wie ein Anfänger oder Endbenutzer behandelt werden, der keine 3 Zeilen Code schreiben kann.
Ich frage diese Fragen, ohne vorher 20 min aufzuzählen was ich bereits weiß und offensichtlich ist, weil es manchmal einfacher ist Jemanden zu fragen der noch mehr Ahnung hat, das Problem bereits kennt, oder ein Profi auf dem Gebiet ist, anstatt den ganzen tag zu verschwenden, Google abzugrasen.

Meine Fehler sind oft nicht super-Standard, weil diese Fehler habe ich bereits gelesen und gelöst, sie sind ja überall beschrieben. Ich versuche dieses Forum möglichst nicht mit Standard Fragen zu Fluten, da sich dann ganz viele Benutzer an den Kopf fassen würden, und man diese ja auch einfach irgendwo nachlesen kann. Meistens sind es komplexere Probleme, offensichtlich unmöglich, gar nicht erst lösbar, Dinge viel zu spezifisch, als das sie jemand schon gefragt hätte, noch nie in diesem Rahmen vorhanden, oder noch nie so gefragt. Ich versuche dann die Fragen so zu stellen das man das versteht.
Wenn es hilft, das ich in Zukunft alle schon gesehenen Lösungen beschreibe, oder das Problem noch genauer Beschreibe, kann ich das gerne tun wenn das bei dessen Lösung hilft.
Mitglied: rubberman
rubberman 09.11.2016 um 18:03:55 Uhr
Goto Top
Versetz dich mal in meine Lage. Ich sitze hier mit der Kristallkugel in der Hand und sehe nichts. Die einzige Informationsquelle für die Helfer in einem Forum, ist der der fragt. Die Antworten auf deine Fragen können also nicht besser sein, als die Informationen die du lieferst.
Es bringt mir nichts, wenn du mir ein Script zur Verfügung stellst, das hunderte Zeilen Code enthält, aber nicht den Fehler repräsentiert, weil es nur ein Teil deines Gesamtpakets ist und bereits beim Versuch es auszuführen wegen ganz anderer Fehler abbricht.
Mir hätten 20 Zeilen Code gereicht, die deinen Fehler reproduzieren, zusammen mit einer Erklärung an welcher Stelle du Hilfe brauchst. Nichts anderes habe ich nun selbst gemacht und dir gezeigt, wie es aussehen könnte. Ob das nun die Lösung für dein Problem war, weiß ich immer noch nicht, da ich mir irgendwas aus den Fingern gesogen habe, was die Aufrufe und den Inhalt der anderen Scripts angeht. Woher soll ich denn wissen, welches nun die 3 Zeilen Code sind, bei denen du ein Problem hattest? Und woher soll ich wissen, ob das Problem tatsächlich in diesem Code steckt und nicht im Zusammenspiel mit den anderen Dateien zu suchen ist? Ich verstehe ja deinen Unmut, aber sorry, wie soll ich denn darauf reagieren? Mir die Arbeit zu ersparen, ein Beispiel zu coden und deine Frage zu ignorieren, wäre natürlich auch eine Option gewesen ...