Per Befehl anderen PC steuern

Hallo in die Runde,

ich brauch mal eure Hilfe für folgende Idee, evtl kann mir jemand weiterhelfen.
Ich möchte einen Button bauen für mAirList bzw. einen Befehl hinterlegen, der per Aktivierung den nächsten Titel ausliest und diesen per Befehl auf einem anderen PC im Netzwerk mit einem bestimmten Programm startet.

Theoretisch hatte ich überlegt, dass mAirList ja den Titel auslesen könnte und diesen in einem Textdokument im Netzwerk ablegt. Das öffnen dieses Titel könnte eine Batch erledigen. (Notfalls könnte mAirList ja auch den Titel einfach in einen bestimmten Ordner kopieren, um dann von dort geöffnet zu werden.) Aber wie übergebe ich nun den Befehl zum anderen Rechner?

Grüße in die Runde

Du kannst das Programm mitloggen und den Eintrag immer durch den aktuellen überschreiben lassen (die txt-Datei hat dann immer nur eine Zeile).

Damit dabei nicht nur der aktuelle Titel ausgelesen wird, sondern auch bzw. stattdessen der nächste (oder übernächste), hat Torben kürzlich erweiterte Optionen für diesen Fall eingefügt. Ich find’s bloß gerade nur nicht.

Wäre das nicht ein Einsatzgebiet für die REST-Thematik?

Übrige Grüße

TSD

Ich denke eher nicht, es soll ja nicht nur etwas aus mairlist gelesen werden, sondern es soll auf dem entfernten Rechner, ja auch gleich etwas getriggert werden, was nichts mit mairlist zu tun hat, wenn ich das richtig verstanden habe.

Wenn es sich bei beiden Rechnern um mAirList 6 Pro handelt, und diese sich im gleichen LAN befinden:

In der Konfiguration unter Erweitert -> Netzwerk-Sync den Sync via UDP aktivieren (Port muss in der Firewall offen sein); jedem Rechner ein Präfix geben, z.B. RECHNER1 und RECHNER2 (voreingestellt ist der Hostnamen).

Dann kann man auf dem ersten Rechner den Befehl “NETWORK RECHNER2 BLABLA” ausführen, der dann auf dem zweiten Rechner als “BLABLA” ankommt. (Das “NETWORK” sagt, dass der Befehl über das Netz rausgehen soll, “RECHNER2” ist der Empfänger.)

Und wenn es sich nicht um mAirList 6 Pro handelt, ginge dann vielleicht, mittels ShellExecute und net use den fernen Rechner zu mounten und dann ebenso auf dem fernen Rechner ein freundliches Programm auszuführen?

Angeschlossene Grüße

TSD


Edit: Nee, letzteres geht ja nicht, das würde ja das Programm auf dem nahen Rechner starten.

Danke für die Ideen.

Prinzipiell handelt es sich um einen Windows 7 Rechner auf dem mairlist6 Pro läuft und einen Windows10 Rechner auf dem die Datei in einem Schnittprogramm gestartet werden soll.
(Sorry, das hatte ich vergessen näher zu beschreiben)

OK, dann ist erst einmal wichtig, dass beide Rechner die Datei unter dem gleichen Speicherort finden.

Der Windows 10 Rechner wird die Datei ja über eine Dateifreigabe vom Windows 7 Rechner holen müssen. Das ist entweder \\Win7Rechnername\Pfad\zur\Freigabe oder besser Du mountest diese Freigabe als Laufwerk, wie @Tondose das beschreibt mit net use unter einem Laufwerksbuchstaben.

Die Syntax dieses Befehls lautet:

NET USE
[devicename | *] [\\computername\sharename[\volume] [password | *]]
        [/USER:[domainname\]username]
        [/USER:[dotted domain name\]username]
        [/USER:[username@dotted domain name]
        [/SMARTCARD]
        [/SAVECRED]
        [/REQUIREINTEGRITY]
        [/REQUIREPRIVACY]
        [[/DELETE] | [/PERSISTENT:{YES | NO}]]

NET USE {devicename | *} [password | *] /HOME

NET USE [/PERSISTENT:{YES | NO}]

Der Trick ist jetzt der, dass Du auf dem Windows 7 Rechner, ebenfalls das gesamte Verzeichnis, unter dem gleichen Laufwerksbuchstaben verfügbar machen musst. Dementsprechend die Titel auch in die mairlist Datenbank einlesen musst. Also alles was jetzt drin ist, ist dann nicht mehr nutzbar und muss neu importiert werden.
Ein Verzeichnis als Laufwerksbuchstaben zuordnen, geht über den Befehl subst.

Weist einem Pfad eine Laufwerkbezeichnung zu.

SUBST [Laufwerk1: [Laufwerk2:]Pfad]
SUBST Laufwerk1: /D

  Laufwerk1:       Bezeichnung für virtuelles Laufwerk, die dem Pfad
                   zugewiesen werden soll.
  [Laufwerk2:]Pfad Physisches Laufwerk und physischer Pfad, die dem
                   virtuellen Laufwerk zugewiesen werden sollen.
  /D               Hebt die Zuordnung für das (virtuelle) Laufwerk1
                   wieder auf.

SUBST ohne Parameter zeigt die mit SUBST erstellten, virtuellen Laufwerke an.

Ist etwas, was ich grundsätzlich als Best-Practise empfehlen würde. Bei mir liegt das Musikarchiv z.B. immer unter M:\Plattenkiste. Das kann ich überall hin schieben, lokal oder Netz am Ende ist es immer dieses Laufwerk und dieser Buchstabe.
Wurde hier: Musik-Planung und hier: On the fly Datenbank von einer festplatte auf mehrere Sende-PC? Auch schon mal diskutiert. Ist nur ein paar Jahre her. (Ich liebe die Suchmaschine des neuen Forums)

Dann könntest Du auf dem mAirlist Rechner eine Batch Datei ausführen, die auf dem Windows 10 Rechner die den Audioeditor öffnet und den Dateipfad übergibt, sofern der Editor das per command line unterstützt.
Fallstrick könnte hier Windows 10 sein, ich bin mir nicht ganz sicher ob die “PS-Utilities” noch funktionieren. Mit PsExec könntest Du den Befehl rüber schicken.


Die PS-Utilities von Sysinternals muss man erst installieren und sich im klaren darüber sein, dass sie ein gewisses Sicherheitsrisiko bedeuten. Also nicht gleich auf dem Produktivsystem installieren, erst mal auf 2 anderen Rechnern (oder VMs) testen, die man hinterher wieder platt machen kann.

Die Entsprechenden Batch Dateien zu erarbeiten, können wir hier gerne machen. Da bin ich ziemlich zu Hause. Damit arbeite ich seit weit über 20 Jahren, die Windows Kommandozeile ist ein sehr mächtiges aber total unterschätztes Werkzeug. PowerShell ist noch eleganter aber da finde ich mich noch nicht so richtig rein.

Über Powershell könnte das mit den Remote Commands auch funktionieren, ist aber noch etwas komplizierter einzurichten, weil die Powershell im Auslieferungszustand aus Sicherheitsgründen relativ eingeschränkt eingestellt ist. Da muss man also erst an die Security Richtlinien.

EDIT: Nachdem was im Microsoft Tech-Net Forum so geschrieben wird funktionieren die PSTools noch mit Windows 10 und werden sogar noch weiterentwickelt.

@shorty.xs Du geiler Typ, ich schreib dir mal ne PM :slight_smile: … Danke soweit schon mal an alle

Hi @Radiologe, ich leiste keinen direkten Support. Wir können gerne alle gemeinsam hier im Forum an einer Lösung arbeiten aber für andere Dinge habe ich keine Zeit und das widerspricht grundsätzlich dem Community Gedanken. Die Community hat einen großen Anteil daran, dass mAirlist das ist was es heute ist und dass es überhaupt noch für Hobbyprojekte genutzt werden kann.

Hey @shorty.xs, stimmt auch wieder. Dann auch gern hier nochmal in Kürze. Beide Rechner hängen auf dem gleichen Server und melden sich an ihm an, sprich, beide haben Zugriff auf einzelne Netzwerklaufwerke. Im Prinzip würde ich also eine Batch ins Netzwerk legen, die die auszuführenden Befehle enthält, sowie auf eine weitere Datei verweist, in die mairlist permanent den nächsten Titel ablegt. (Beide Rechner können ja auf die eigentliche Datei zugreifen, da die sich im Netzwerk befinden, mairlist würde also nur den Speicherpfad auslesen bzw ins File schreiben)
Isngesamt würde das bedeuten, man müsste quasi nur noch durch den Button bei mairlist den Befehl zum Ausführen der Batch an den zweiten Rechner schicken. Dafür wäre das PsExec das Tool der Wahl?

OK, bei so einem Projekt ist Salamitaktik natürlich nicht hilfreich.

Wir haben also inziwschen 3 Rechner, die Involviert sind.

  1. Windows 7 Rechner mit mAirlist
  2. Windows 10 Rechner mit Audioeditor
  3. Einen Server mit SMB Freigabe, auf dem die Musikdaten liegen

Kommt noch etwas dazu oder ist das jetzt alles?
Die art der Datenbankverbindung sollte keine Rolle spielen, wir gehen ja von der aktuell geladenen Playliste aus. Das würde also mit einer Home-Version von mAirlist, genau so funktionieren.

Können wir also davon ausgehen, das auf beiden Windows PCs die Mediensammlung unter dem gleichen Laufwerksbuchstaben und Pfad gemountet sind und diese Mounts auch als Presistant verfügbar sind oder über die Domänenanmeldung im Windows Netzwerk entsprechend wiederhergestellt werden?
EDIT: Sind die Rechner in einer Windows Domäne oder was ist das für einen Netzwerkstruktur?

Als erstes solltest Du also herausfinden, mit welchen Command-Line Parametern Dein Audioeditor umgehen kann. Kann ich dem einfach einen Dateinamen mitgeben, so wie mAirlist das bei einem lokal installierten Editor auch machen würde?

Ich nehme hier mal Audacity als Beispiel, das akzeptiert eine oder mehrere Audiodateien als Parameter.
"c:\Program Files (x86)\Audacity\audacity.exe" /?
image

Du solltest also auf Deinem Windows 10 Rechner aus der Commandozeile, den kompletten Pfad zum Audioeditor gefolgt vom kompletten Pfad zur Audiodatei ausführen und schauen ob das funktioniert und die Entsprechende Kommandozeile hier veröffentlichen.

In meinem Beispiel mit Audacity währe das also etwa so:
"c:\Program Files (x86)\Audacity\audacity.exe" "m:\Plattenkiste\Einzelne Titel\#Promotion\Radio-Zoom\Agentur\Super-Interpret - Ganz toller Titel [Superduper Radio Mix].mp3"

Das ist alles eine Zeile.

Ja, das ist alles :slight_smile:
Es ist eine Windows-Domäne und die Laufwerkskennungen sind gleich gemountet.

Bei mir ergibt sich folgende Kommandozeile:

“C:\Program Files (x86)\Adobe\Adobe Audition 3.0\Audition.exe” “Z:\Musik Neu\90er\Beat System - Fresh.mp3”

OK, hast Du auch getestet, ob Audition, die Audiodatei korrekt öffnet?

Dann solltest Du jetzt ein Log-File anlegen, in das mAirlist den Titel schreibt. Für die ersten Tests, reicht es, wenn Du den gerade laufenden Titel nimmst.

Vielleicht erst mal auf dem gleichen Netzlaufwerk?
Dann kannst Du im 2. Schritt testen, ob eine Batchdatei, lokal auf dem Windows 10 Rechner, das macht, was Du aus mAirlist erreichen möchtest.

Du solltest Dir mindestens einen 3. Rechner besorgen, auf dem Du PsExec zunächst einmal ausprobieren kannst bevor Du das auf dem Produktivsystem ausprobierst. Ich würde PsExec (und nur das, nicht die anderen Tools) als Administrator nach %SystemRoot%\System32\ kopieren. Es muss nur auf den Rechner, von dem aus die Befehle geschickt werden. Also in diesem Fall, Dein 3. Testrechner.

EDIT: Es muss nur mit Admin-Rechten dort hin kopiert werden. Danach reichen normale Benutzerrechte um es auszuführen. Die sollten entsprechend gesetzt sein. Eigentlich Default für alle normalen Windows User.

So hier mal ein erster Wurf.

Der führt psexec noch nicht aus sondern stoppt dort und gibt den Befehl den er jetzt starten würde, in der console aus. Schade, ich darf keine cmd Dateien hochladen.

::
:: This is a Windows Bathch script that can read a txt logfile an pass a Windows CMD to a remote computer
:: For example launch an Audio Allication on a remote Computer and pass over an Audio-File.
::
:: @package     
:: @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
:: @author      Malte Schroeder <post@malte-schroeder.de>
:: @copyright   Copyright (c) 2019 Malte Schroeder (http://www.malte-schroeder.de)
::
@echo off
setlocal enabledelayedexpansion
set _ver=0.0.1


:: Settings Area Changes on the script should only be required here
::-----------------------------------------------------------------
:settings
set _psexec=%SystemRoot%\System32\PsExec.exe
set _logfile=z:\logdir\transferfile.txt
set _remoteapp=C:\Program Files (x86)\Adobe\Adobe Audition 3.0\Audition.exe
set _remotecomputer=\\Nettop
 


::-----------------------------------------------------------------
:: End of Settings Area

:: make some nice Window Title
title Remote-App Launcher %_ver%
:: clear Varyable in case it is still existing
set _AudioFile=
set _error=

:start
:: let us read the Filename
if exist %_logfile% (
	set /p _AudioFile=<"%_logfile%"
	) else (
	set _error=Logfile Not Found && goto :error
	)
echo %_psexec% -i %_remotecomputer% "%_remoteapp%" "%_AudioFile%"
pause

goto ende
:error
echo %_error%
pause


:ende
endlocal
exit

Etwas verfeinert.

::
:: This is a Windows Bathch script that can read a txt logfile an pass a Windows CMD to a remote computer
:: For example launch an Audio Allication on a remote Computer and pass over an Audio-File.
::
:: @package     
:: @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
:: @author      Malte Schroeder <post@malte-schroeder.de>
:: @copyright   Copyright (c) 2019 Malte Schroeder (http://www.malte-schroeder.de)
::
@echo off
setlocal enabledelayedexpansion
set _ver=0.0.2


:: Settings Area Changes on the script should only be required here
::-----------------------------------------------------------------
:settings
set _psexec=%SystemRoot%\System32\PsExec.exe
set _logfile=z:\logdir\transferfile.txt
set _remoteapp=C:\Program Files (x86)\Adobe\Adobe Audition 3.0\Audition.exe
set _remotecomputer=\\Nettop
 


::-----------------------------------------------------------------
:: End of Settings Area

:: make some nice Window Title
title Remote-App Launcher %_ver%
:: clear Varyable in case it is still existing from previous execution.
set _AudioFile=
set _error=

:errorcheck
:: let us check if all the files are available
if not exist %_psexec% set _error=%_psexec% does not exist. Make sure to install Sysinternals PsExec and Change the correct Path. && goto :error
if not exist %_logfile% set _error=%_logfile% does not exist. Make sure to have mAirlist output the File. && goto :error


:start
:: let us read the Filename
set /p _AudioFile=<"%_logfile%"
::let us check if the Audio File really exist, before we hand it over to the other computer.
if not exist %_AudioFile% set _error=%_AudioFile% does not exist or wrong Logging Parameter is set in mAirlist. && goto :error
echo %_psexec% -i %_remotecomputer% "%_remoteapp%" "%_AudioFile%"
pause

goto ende

:error
:: Something went wrong so let us inform the user.
echo %_error%
pause


:ende
endlocal
exit

EDIT: Übrigens die entsprechenden Log-Einstellungen sind hier: Playlist aktuell gespielter Titel immer oben im Playlistfenster Nur der Haken: Datei bei jedem Logeintrag überschreiben muss rein.
Für den nächsten oder den übernächsten, entsprechend %+1 oder %++1
https://wiki.mairlist.com/reference:logging_variables#subsequent_items

Danke, das funktioniert einwandfrei. Ich bin jetzt gerade noch dran am Server zu schrauben bzw an dessen Firewall, dann geht es weiter :smiley:
Ganz herzlichen Dank, ich melde mich :slight_smile:

Apropos Firewall. Die wirst Du vermutlich auf der Windows 10 Kiste mit dem Audioeditor auch anpassen müssen.

Ich habe noch ein paar Anpassungen am Script gemacht.
Noch ein paar mehr Fehlerabfragen, mehr Anleitung im Kopf.
Der Remote Computer wird jetzt ohne führenden Doppelbackslash eingetragen.
Jetzt wird der PsExec auch ausgeführt, ich habe das aber nicht final getestet.

::
:: This is a Windows Bathch script that can read a txt logfile an pass a Windows CMD to a remote computer
:: For example launch an Audio Allication on a remote Computer and pass over an Audio-File.
::
:: @package     
:: @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
:: @author      Malte Schroeder <post@malte-schroeder.de>
:: @copyright   Copyright (c) 2019 Malte Schroeder (http://www.malte-schroeder.de)
::
::
:: In order to use this Batch file, you need to have Sysinternals PsExec installed. https://docs.microsoft.com/en-us/sysinternals/downloads/psexec
:: You should be aware that the usage of this tool can have an impact on your network security. Other tools from the PsTools package are not needed so should not be installed on your computer.
:: First use of PsExec will prompt for an EULA accaptence. This step is only required once.

@echo off
setlocal enabledelayedexpansion
set _ver=0.0.3


:: Settings Area Changes on the script should only be required here
::-----------------------------------------------------------------
:settings
set _psexec=%SystemRoot%\System32\PsExec.exe
set _logfile=d:\Neues Textdokument.txt
set _remoteapp=C:\Program Files (x86)\Adobe\Adobe Audition 3.0\Audition.exe
set _remotecomputer=Nettop
::-----------------------------------------------------------------
:: End of Settings Area

:: make some nice Window Title
title Remote-App Launcher %_ver%
:: clear Varyable in case it is still existing from previous execution.
set _AudioFile=
set _error=

:errorcheck
:: let us check if all the files and the remote Computer are available
set /p =Check Logfile . . . .  . . . . <nul
if not exist "%_logfile%" set _error=%_logfile% does not exist. Make sure to have mAirlist output the File. && goto :error
echo OK
set /p =Check PsExec . . . .  . . . . . <nul
if not exist "%_psexec%" set _error=%_psexec% does not exist. Make sure to install Sysinternals PsExec and Change the correct Path. && goto :error
echo OK
set /p =Check Remote Computer . . . . . <nul
ping -n 1 %_remotecomputer% > nul
if %errorlevel% GEQ 1 set _error=Remote Computer %_remotecomputer% does not answer ping. && goto :error
echo OK

:start
:: let us read the Filename
set /p _AudioFile=<"%_logfile%"
::let us check if the Audio File really exist, before we hand it over to the other computer.
if not exist %_AudioFile% set _error=%_AudioFile% does not exist or wrong Logging Parameter is set in mAirlist. && goto :error
%_psexec% -i \\%_remotecomputer% "%_remoteapp%" "%_AudioFile%"


goto ende


:error
:: Something went wrong so let us inform the user.
echo Error
echo %_error%
pause


:ende
endlocal
exit

Hello again,

Danke für die gute Hilfe bis hier her…ich habe das Problem jetzt über Watch4Folder gelöst und einen Button gelöst, der bei Auslösung ein File im überwachten Ordner erstellt, der zweite Rechner erkennt damit die Änderung und löst ein Ereignis aus.

Mein Problem aktuell dreht sich dabei allerdings noch ums Logging.
mAirList soll ja den nächsten Titel loggen, der dann vom anderen System ausgelesen wird. Ich möchte ja aber nur Musik-Elemente loggen, dem zufolge habe ich den Filter auf “Musik” gestellt.
Nun ist es allerdings so, dass mAirList ja nur einen Logeintrag schreibt, wenn das nächste Element tatsächlich ein “Musik”-Element ist.
Wie bekomme ich denn hin, dass mAirList nicht schaut, ob das nächste Element Musik ist, sondern nach dem nächsten Musik-Element schaut?

OK, da müssen die mAirlist Script Gurus ran. Da bin ich leider nicht der richtige.

Das Script müsste die Playliste nach dem nächsten (nicht das aktuelle) Element vom Typ Musik durchsuchen und immer dann getriggert werden, wen entweder eine neue Playliste geladen wird oder ein Player startet.
Das gefunde Element dann in die Text Datei schreiben, anstatt dass das die Logging Funktion übernimmt.

Hier: Vollautomatische Ausspielung von Wiederholungen und Vorproduzierten Sendungen hatten wir schon mal was ähnliches. Es wird die Playliste nach einem Element vom Typ Sendung durchsucht. Das geht in die richtige Richtung aber es wird nur beim laden einer Playliste getriggert. Hier allerdings beschränkt auf 3 Elmente.

BZW. jetzt wo ich gerade hier schreibe, Du brauchst ja gar keine Automatik, Du willst das ja auf einen Button legen. Dann passt das Script doch ziemlich gut.

Also noch mal:
Das Script muss die aktuelle Playliste durchsuchen und ausgehend vom aktuellen Eintrag, den nächsten vom Typ Musik finden und in die Log-Datei schreiben.
Trigger erfolgt per Bildschirm Objekt Button/ Zugeordneter Fernsteuerung.