Suche

lichtschattenblog

Verfasser

tebori

unbeaufsichtigte Installation von Kodi unter Windows

Vorab: Bei Verwendung der hier genannten Skripte und eventuell resultierenden Schäden übernehme ich keine Haftung. Jegliche Verwendung erfolgt auf eigene Gefahr.

 

Zur unbeaufsichtigten Installation und Deinstallation von Kodi gibt es ein paar Möglichkeiten dies auszuführen.

Wichtig ist vorab die Logik zur Konfiguration von Kodi zu verstehen. Die zusammenfassend sind:

  • eine Installation von Kodi im Silent Mode kann mit dem Argument /S durchgeführt werden
  • Anpassungen von Kodi werden unter Windows unterhalb %appdata% des jeweiligen Benutzers gespeichert
  • für eine angepasste Installation und Konfiguration müssen alle wichtigen Dateien zu den vorgenommen Anpassungen erkannt und gespeichert werden. Dies kann ggf. nur durch ausprobieren erfolgen
  • teilweise können Konfigurationsdateien aus älteren Kodi-Versionen problemlos übernommen werden. Ggf. erfolgt eine automatische Aktualisierung einiger Dateien, wie db-Dateien

In meinem Fall wurde ein Kodi in Version 17.6 verwendet. Abweichend zur Standardinstallation liegen Anpassungen zur Verwendung von tvheadend (pvr.hts), deutscher Oberfläche, dem Skin, reduzierten Menüs (keine Bilder, keine Musikdatenbank, keine Videodatenbank), reduzierten Benutzerrechten (aktiviertem Master-Password) und Verwendung einer Hama-Fernbedienung vor. In diesem Fall sind die Anpassungen in den folgenden Dateien gespeichert:

Wie kann nun die unbeaufsichtigte Installation erfolgen?

Zunächst kopieren wir das Verzeichnis kodi aus %appdata% bzw. c:\users\<dein benutzername>\AppData\Roaming in eine geeignete Freigabe (bei Verwendung meiner Skripte zusätzlich in den Unterordner appdata) auf einem Server und löschen alle nicht relevanten Dateien und Ordner in der Kopie. Wer Anpassungen in weiteren Addons durchgeführt hat, muss speziell die Dateien unterhalb …\kodi\userdata\addon_data berücksichtigen.

Anschließend kann die Verteilung automatisiert über eine Gruppenrichtlinie (gpo) oder wie in meinem Fall über einen Remoteinstallationsserver (Remote Installer von Firma emco software: https://emcosoftware.com/) erfolgen. Vorteil ist die Installation und Aktualisierung von Programmen zum laufenden Betrieb.

Anbei die von mir selbst erstellten Skripte. Die Verwendung mit diesen Skripten bei Installation von Kodi 17.6 war bisher unter Windows 10 problemlos. Unter Windows 7 gab es wenige Rechner wo die Installation nicht möglich war, da ein notwendiges Windows-Update nicht installiert werden konnte (bei manueller Installation erscheint eine Fehlermeldung die mit <Enter> bestätigt werden muss). In diesem Fall und Einsatz von Gruppenrichtlinien würde die Installation nicht erfolgreich sein und erst nach 15 Minuten zum Rechnerstart die Installation abgebrochen werden. Daher empfehle ich unter Windows 7 Kodi 16.

Anbei die drei Skripte, welche in der Freigabe gespeichert werden. In diesem Verzeichnis gibt es die Installationsdatei kodi-17.6-Krypton-x86.exe und das Unterverzeichnis appdata mit den entsprechenden Dateien vom kodi (<Verzeichnis als Freigabe>\appdata\kodi).

Hinweis: In meinen Skripten ist das Verzeichnis kodi unterhalb %appdata% weiterhin vorhanden!

 

install_kodi.bat

@echo off

set "install_file=%~dp0kodi-17.6-Krypton-x86.exe"
set "refresh_appdata_script=%~dp0kodi_refresh_appdata.bat"
set "win10_kodi_lnk=C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Kodi\Kodi.lnk"


:KILL_KODI_PROCESS
taskkill /F /IM kodi.exe /T > nul


:INSTALL_KODI
"%install_file%" /S


:REFRESH_APPDATA_KODI
call "%refresh_appdata_script%"


:CREATE_KODI_LNK
REM needs admin rights
if EXIST "%win10_kodi_lnk%" (

xcopy "%win10_kodi_lnk%" "%allusersprofile%\Desktop" /R /Y > nul

)

 

kodi_refresh_appdata.bat

@echo off

set "appdata_source=\\<servername>\kodi$\appdata"

if NOT "%ProgramFiles(x86)%" == "" (
if EXIST "%ProgramFiles(x86)%\kodi\kodi.exe" GOTO REFRESH_APPDATA_KODI
) else (
if EXIST "%ProgramFiles%\kodi\kodi.exe" GOTO REFRESH_APPDATA_KODI
)

GOTO END


:REFRESH_APPDATA_KODI
if NOT "%appdata_source%" == "" (
for /F "delims=*" %%a in ('dir /B c:\Users ^| find /V /I "TEMP" ^| find /V /I "Public" ^| find /V /I "Default.migrated"') do (
if EXIST "c:\users\%%a\AppData\Roaming\" (
echo try: xcopy "%appdata_source%" "c:\users\%%a\AppData\Roaming\" /E /C /I /R /Y
xcopy "%appdata_source%" "c:\users\%%a\AppData\Roaming\" /E /C /I /R /Y
)
)
)

:END

remove_kodi.bat

@echo off

set "win10_kodi_lnk=C:\Users\Public\Desktop\Kodi.lnk"


:KILL_KODI_PROCESS
taskkill /F /IM kodi.exe /T > nul


:START_UNINSTALL_KODI
if NOT "%ProgramFiles(x86)%" == "" (
if EXIST "%ProgramFiles(x86)%\kodi\uninstall.exe" ( "%ProgramFiles(x86)%\kodi\uninstall.exe" /S )
) else (
if EXIST "%ProgramFiles%\kodi\uninstall.exe" ( "%ProgramFiles%\kodi\kodi.exe" /S )
)

:CLEAN_APPDATA_KODI

for /F "delims=*" %%a in ('dir /B c:\Users ^| find /V /I "TEMP" ^| find /V /I "Public" ^| find /V /I "Default.migrated"') do (
if EXIST "c:\users\%%a\AppData\Roaming\Kodi" (
echo try: rmdir /S /Q "c:\users\%%a\AppData\Roaming\Kodi\"
rmdir /S /Q "c:\users\%%a\AppData\Roaming\Kodi\"
)
)

:REMOVE_DESKTOP_LINK
if EXIST "%win10_kodi_lnk%" (
del "%win10_kodi_lnk%"
)

 

Anbei ein paar Erläuterungen zum Skript install_kodi.bat:

  • %~dp0 bedeutet das Verzeichnis indem sich die install_kodi.bat befindet
  • %~dp0kodi-17.6-Krypton-x86.exe ist somit bei Ausführung \\<servername>\<freigabe>\kodi-17.6-Krypton-x86.exe
  • zu Beginn wird ein ggf. bestehender Kodi-Prozess beendet
  • die Installation von Kodi mit Option /S wird durchgeführt (großes S !!!)
  • kodi_refresh_appdata.bat wird gestartet
  • Verknüpfung zum Aufruf von Kodi wird auf den Desktop für alle Benutzer kopiert
  • mit diesem Skript kann auch eine Aktualisierung oder Neuinstallation von Kodi erfolgen

Ein paar Erläuterungen zum kodi_refresh_appdata.bat:

  • zu Beginn wird das Verzeichnis mit der AppData-Kopie von kodi definiert
  • Hinweis: sofern mehrere Verzeichnisse mit abweichender AppData-Kopie definiert werden müssen (Beispiel mehrere TVHeadend-Server), kann dies ggf. durch Abgleich mit dem Standardgateway erfolgen:
    ipconfig | find /I „192.168.x.x“ if %ERRORLEVEL% == 0 ( set „appdata_source=\\<servername>\kodi$\appdata_standort1“ )
  • es wird geprüft ob Kodi installiert ist und wenn ja werden die Kodi-Konfigurationsdateien für alle Benutzer auf dem jeweiligen System (außer Public, Temp und Default.Migrated) aktualisiert
  • dieses Skript kann separat bei einer bereits erfolgten Installation zur Konfigurationsaktualisierung verwendet werden
  • die Verwendung erfordert vollen administrativen Zugriff auf die Verzeichnisse der verschiedenen Benutzer

Ein paar WICHTIGE Erläuterungen zu remove_kodi.bat:

  • zu Beginn wird ein ggf. bestehender Kodi-Prozess beendet
  • die Deinstallation von kodi über uninstall.exe mit Option /S wird durchgeführt (großes S !!!)
  • für alle Benutzerprofile auf dem PC werden die Konfigurationsdateien vom Kodi gelöscht
    Wer dies nicht möchte muss die Zeile:
    rmdir /S /Q „c:\users\%%a\AppData\Roaming\Kodi\“
    löschen oder REM zu Beginn der Zeile:
    rmdir /S /Q „c:\users\%%a\AppData\Roaming\Kodi\“
    schreiben.
    also: REM rmdir /S /Q „c:\users\%%a\AppData\Roaming\Kodi\“
    Bei falscher Anwendung und Anpassung dieser Zeile besteht die Möglichkeit von Datenverlust. Ggf. diese Zeile löschen!!!
  • es wird die Desktop-Verknüpfung von Kodi gelöscht
Advertisements

Windows 7 – Deaktivierung Sicherheitsabfrage bei Aufruf Programme im Netzwerk via Desktop-Verknüpfung

Mit Windows-Taste + R Eingabe-Dialog öffnen und GPEDIT.MSC ausführen.

Anschließend Benutzerkonfiguration -> Administrative Vorlagen -> Windows-Komponenten -> Anlagen-Manager auswählen.

Aufnahmeliste für Dateitypen mit niedrigem Risiko aktivieren.

Unter Dateiendungen die gewünschte Dateiendung hinterlegen: .exe

Bei weiteren Dateiendungen einfach mit Semikolon trennen.

Ggf. noch Standardrisikostufe für Dateianlagen auf Niedrige Stufe setzen.

 

PRTG – Skript zur Abfrage am Remote MS Windows Server – XML-Datensatz

Zur Überwachung des Lastenausgleichs einer Citrix XenApp-Server-Umgebung war es notwendig die Befehlsausgabe von qfarm /load via XML im PRTG einzulesen. Es besteht hierbei natürlich die Möglichkeit dies für andere Systeme und Befehle zu verwenden.

Eine typische Ausgabe von qfarm /load ist:

prtg_gfarm_load_example

Bei meinen Tests habe ich zwei Varianten erfolgreich testen können. Ich persönlich bevorzuge Variante 1 mit PowerShell. Variante 2 via batch-Skripte und Freigabe hat den Nachtteil, das ggf. das Skript per Hand gestartet und zusätzlich die Ausführung überwacht werden muss. Kann aber im Bedarfsfall ein guter Ersatz sein.

Variante 1 – via Powershell-Skript:

Bei dieser Variante mittels Powershell muss zunächst sichergestellt werden, dass der Remote-Server sogenannte Invoke-Commands erfolgreich akzeptiert. Dies machen wir auf unserem PRTG-Server mittels dem Powershell-Befehl:

  • test-wsman <Remote-Server>

Wenn die Konfiguration noch nicht korrekt ist, erhalten wir folgende Meldung:

prtg_powershell_test

In diesem Fall führen wir die folgenden Befehle aus:

  • Enable-PSRemoting -Force
  • Set-Item wsman:\localhost\client\trustedhosts *
  • Restart-Service WinRM

Wer nicht allen Systemen die Remote-Ausführung von PowerShell-Befehlen gestatten will muss das * im zweiten Befehl mit einer Liste der gewünschten Systeme austauschen.

  • Set-Item wsman:\localhost\client\trustedhosts „server01, server02“

Hinweis: Bei jeder Änderung muss der dritte Befehl erneut ausgeführt werden.

Wenn die Konfiguration korrekt ist erhalten wir zur Ausführung des PowerShell-Befehls:

  • test-wsman <Remote-Server>

prtg_powershell_test_success

Hinweis: Zum erweiterten Test, mit der Möglichkeit PowerShell-Befehle direkt auf dem Remote-Server ausführen zu können und dass die bestehenden Rechte ausreichend sind, stehen folgende PowerShell-Befehle zur Verfügung:

  • Enter-PSSession -ComputerName
  • Enter-PSSession -ComputerName <Remote-Server> -Credential <Remote-Username>

Jetzt erstellen wir auf unserem Remote-Server ein geeignetes Verzeichnis und hinterlegen dort eine entsprechende Skript-Datei. In meinem Fall C:\PRTG und:

  • prtg_get_qfarm_load.ps1

In dieser Datei hinterlegen wir folgenden Code:

Set-ExecutionPolicy Unrestricted

[string]$cmd = 'qfarm'
[string]$par = '/load'

[array]$cmdoutput = & $cmd $par

$cmdoutput = $cmdoutput[3..($cmdoutput.length)]

Write-Host '<?xml version="1.0" encoding="Windows-1252" ?>'
Write-Host '<prtg>'

foreach ($line in $cmdoutput) {

 $line = $line -replace '\s+', ' '

 $lineparts = $line.Split(' ')

 Write-Host ' <result>'
 Write-Host -Separator '' '  <channel>'$lineparts[0]' - LOAD</channel>'
 Write-Host -Separator '' '  <value>'$lineparts[1]'</value>'
 Write-Host '  <unit>Load</unit>'
 Write-Host '  <float>0</float>'
 Write-Host '  <LimitMaxError>10000</LimitMaxError>'
 Write-Host '  <LimitErrorMsg>Server'$lineparts[0]'ist maximal ausgelastet. Prozessorlast bzw. RAM-Nutzung zu hoch. Bitte korrigieren!</LimitErrorMsg>'
 Write-Host '  <showChart>1</showChart>'
 Write-Host '  <showTable>1</showTable>'
 Write-Host '  <LimitMode>1</LimitMode>'

 Write-Host ' </result>'

}

Write-Host '</prtg>'

Führen wir nun die Datei in der powershell aus bekommen wir eine Ausgabe ähnlich:

prtg_qfarm_load_ps1_test

Jetzt müssen wir nur noch auf unserem PRTG-Server dafür sorgen, dass dieses Skript remote aufgerufen wird. Hierzu erstellen wir auf unserem PRTG-Server im Verzeichnis:

C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML

eine entsprechende PowerShell-Datei. In meinem Fall:

  • prtg_get_qfarm_load_remote.ps1

In dieser Datei fügen wir folgenden kurzen Code ein:

Invoke-Command -ComputerName $args[0] -ScriptBlock { & C:\PRTG\prtg_get_qfarm_load.ps1 }

Hinweis: Ggf. den Namen der PowerShell-Datei auf dem Remote-Server anpassen!

Zum Test wechseln wir in die Powershell und rufen das Skript mit dem Computernamen des Remoteservers als alleiniges Argument auf:

& 'C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\prtg_get_qfarm_load_remote.ps1' <Remote-Server>

und erhalten als Beispiel:

prtg_qfarm_load_remote_ps1_test

Hinweis: Zur Ausführung des Befehls auf meinem PRTG-Server steht oben rechts PS. Wenn durch Tests mit Eurem Remote-Server dort dessen Name zu sehen ist, arbeitet ihr in der PowerShell auf dem falschen System!

Im PRTG selbst fügen wir bei unserem bestehenden Server einen neuen Sensor vom Typ:

  • Programm/Skript (erweitert)

hinzu. Im zweiten Schritt ist zwingend darauf zu achten, dass der Sicherheitskontext auf „Die Anmeldedaten für Windows des übergeordneten Geräts verwenden“ gesetzt ist und unser Skript ausgewählt ist. Bitte beachten dass ggf. die Anmeldeinformationen vom Server gesetzt werden müssen.

prtg_qfarm_load_add_sensor.jpg

Nach zweimaliger Ausführung des Skripts durch den Server sehen wir nun:

prtg_qfarm_load_final_sensor_v2

 

Variante 2 – via batch-Skripte und Freigabe

Eine zweite Variante, die ich mir im Vorfeld überlegt und getestet habe, ist die lokale Ausführung eines batch-Skriptes, in einer Schleife, auf dem Remote-Server.

Hierzu habe ich auf dem Remote-Server ein Verzeichnis PRTG angelegt und als PRTG$-Freigabe für den PRTG-Server verfügbar gemacht.

In das Verzeichnis habe ich eine Datei: prtg_get_qfarm_load.bat erstellt.

@echo off

SET "TEMPOUTPUTFILE=C:\PRTG\prtg_get_qfarm_load.tmp"
SET "OUTPUTFILE=C:\PRTG\prtg_get_qfarm_load.xml"

:LOOP

if NOT "%OUTPUTFILE%" == "" (

 (

 echo ^<?xml version="1.0" encoding="Windows-1252" ?^>
 echo ^<prtg^>

 for /f "skip=2 tokens=1,2 delims= " %%a in ('qfarm /load ^| findstr /v /r /i "^--"') do (

  echo ^<result^>
  echo  ^<channel^>%%a - LOAD^</channel^>
  echo  ^<value^>%%b^</value^>
  echo  ^<unit^>Load^</unit^>
  echo  ^<float^>0^</float^>
  echo  ^<LimitMaxError^>10000^</LimitMaxError^>
  echo  ^<LimitErrorMsg^>Server %%a ist maximal ausgelastet. Prozessorlast bzw. RAM-Nutzung zu hoch. Bitte korrigieren! ^</LimitErrorMsg^>
  echo  ^<showChart^>1^</showChart^>
  echo  ^<showTable^>1^</showTable^>
  echo  ^<LimitMode^>1^</LimitMode^>
  echo ^</result^>

  )

 echo ^</prtg^>
 ) > "%TEMPOUTPUTFILE%"

move %TEMPOUTPUTFILE% %OUTPUTFILE%

TIMEOUT /T 10 /NOBREAK > nul
GOTO LOOP

)

 

Zur Ausführung der Skript-Datei wird eine Temp-Datei als XML erzeugt, da die Ausführungszeit von qfarm /load ggf. zu lang ist und das Ergebnis vom PRTG-Server nicht vollständig gelesen wird. In diesem Fall hätten wir einen Fehler im PRTG. Nach Abschluss der Generierung der Temp-Datei wird diese in die Zieldatei umbenannt und die alte XML-Datei überschrieben. Das Skript führt die Schleife alle 10 Sekunden aus.

Damit diese Batch-Datei auf dem Server nicht sichtbar ist, habe ich diese mit dem Tool Bat-To-Exe-Converter, Portable Variante, mit folgendem Befehl in eine exe-Datei umgewandelt:

Bat_To_Exe_Converter.exe -bat c:\prtg\prtg_get_qfarm_load.bat -save c:\prtg\prtg_get_qfarm_load.exe -invisible

Durch einmalige manuelle Ausführung der prtg_get_qfarm_load.exe-Datei wird nun alle 10 Sekunden die gewünschte XML-Datei generiert.

Hinweis: Um diesen Vorgang beenden zu können, muss der laufende Prozess prtg_get_qfarm_load.exe über den TaskManager oder taskkill-Befehl beendet werden (Bsp.: taskkill /F /IM prtg_get_qfarm_load.exe /T).

Hinweis: Meine ursprüngliche Idee war die Erstellung eines Dienstes mit dem Befehl sc create. Leider war dies nicht erfolgreich. Wer hierzu erfolgreich eine exe-Datei als Dienst aktivieren konnte, mir bitte einen Kommentar senden. Gerne hinterlege ich hier die funktionierende Variante.

Zum Abruf der Daten in der XML-Datei ist erforderlich dies über ein Skript ans PRTG zu übergeben. Nach Auskunft vom PRTG-Support besteht nicht die Möglichkeit XML-Dateien direkt einzulesen.

Auf dem PRTG-Server, im Verzeichnis C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML habe ich eine Datei read_prtg_get_qfarm_load.bat erstellt, deren Aufgabe lediglich die Ausgabe des Dateiinhaltes ist.

@echo off
type \\<remote-server>\prtg$\prtg_get_qfarm_load.xml

Im PRTG selbst fügen wir bei unserem bestehenden Server einen neuen Sensor vom Typ:

  • Programm/Skript (erweitert)

hinzu und wählen dass von uns hinterlegte Skript aus:

prtg_qfarm_load_batch_add_sensor

Auch hier sehen wir nach zweimaliger Abfrage des Sensors:

prtg_qfarm_load_batch_final_sensor

 

Quellen:

MS-DOS mit Netzwerkunterstützung unter VM Ware und Zugriff auf Netzwerkfreigabe unter MS Windows Server 2012R2

Auch wenn es für viele in der heutigen Zeit nicht vorstellbar ist, kommen teilweise noch Systeme mit MS-DOS 6.22 und älter zum Einsatz.

In diesem Fall besteht die Notwendigkeit einen alten Server durch einen neuen mit MS Windows Server 2012R2 zu ersetzen. Dabei bleiben einige Systeme auf MS-DOS 6.22 erhalten.

Zum Test des Servers, dass auch Verbindungen von MS-DOS 6.22 auf diesen möglich sind, habe ich unter VM Ware Workstation MS-DOS 6.22 mit MS Network Client 3.0 installiert.

Wichtig war für mich, dass ich ein Produktivsystem nicht gefährde, bei dem nur noch bedingt Support möglich ist.

Ansonsten stammen meine Erfahren mit Netzwerk unter MS-DOS aus Kindheitstagen vor über 20 Jahren mit NE2000-kompatiblen Netzwerkkarten, um via Netzwerk gemeinsam spielen zu können. Die Speicherkonfiguration unter MS-DOS wurde damals exzessiv betrieben und die hier verwendeten Befehle sind ebenso im Gedächtnis eingebrannt.

Das Schöne unter MS-DOS ist, dass bereits durch Sicherung der Verzeichnisstruktur alle Treiber und Konfigurationsdateien für den Ernstfall vorliegen und auf Basis dieser kleinen Dokumentation ein System wiederhergestellt werden kann. Lediglich der Bedarf der passenden Treiberdiskette bei Tausch der Netzwerkkarte kann in Zukunft ein größeres Problem werden.

Vorbereitung Server:

Damit die Serverfreigaben von MS Windows Server 2012R2 mittels MS-DOS 6.22 genutzt werden können, müssen folgenden Maßnahmen am Server durchgeführt werden:

  • Aufruf der Management Console mittels Befehl mmc
  • Mit STRG + M rufen wir den Dialog zum Hinzufügen von Snap-Ins auf und wählen
    Richtlinien für Lokale Computer und schließen den Dialog
  • Wir wechseln nun im linken Dialog unter Konsolenstamm, Richtlinien für Lokale Computer -> Computerkonfiguration -> Windows-Einstellungen -> Sicherheitseinstellungen -> Lokale Richtlinien -> Sicherheitsoptionen und prüfen folgende Optionen, ob diese wie folgt gesetzt sind:
    • Microsoft-Netzwerk (Client): Kommunikation digital signieren (immer):
      -> Deaktiviert
    • Microsoft-Netzwerk (Client): Kommunikation digital signieren (wenn Server zustimmt):
      -> Deaktiviert
    • Microsoft-Netzwerk (Server): Kommunikation digital signieren (immer):
      -> Deaktiviert
    • Microsoft-Netzwerk (Server): Kommunikation digital signieren (wenn Client zustimmt):
      -> Deaktiviert
    • Netzwerksicherheit: Keine LAN Manager-Hashwerte für nächste Kennwortänderung speichern:
      -> Deaktiviert
    • Netzwerksicherheit: LAN Manager-Authentifizierungsebene:
      -> Nur NTLM Antworten senden

ms_windows_server_2012r2_netzwerksicherheit_msdos.jpg

  • Anschließend erstellen wir den lokalen Benutzer auf unserem Server und setzen das Passwort. Bei bestehenden Benutzern muss das bestehende Kennwort erneut gesetzt werden!
    Hinweis: Einfach erneut STRG + M und anschließend Lokale Benutzer und Gruppen auswählen
  • Anschließend richten wir auf dem Server eine Freigabe ein (es wird hierbei empfohlen kurze Freigabenamen zu verwenden) und erteilen dem lokalen Benutzer für das Verzeichnis der Freigabe mindestens Leserechte.
    Hinweis: Zur Auswahl den Suchpfad auf den Server setzen und nach dem vollständigen Benutzernamen suchen!

Vorbereitung VM und Installation MS-DOS 6.22:

Die Installation von MS-DOS 6.22 unter VMware Workstation ist nicht besonders schwierig. Zu beachten sind hierbei:

  • Zur Option Install from: wählen wir die Option: I will install the operating system later
  • Guest operation system: Other, Version MS-DOS
  • Bei Maximum disk size (GB): reichen bereits 0.02 GB
  • Im Dialog: Ready to Create Virtual Machine wählen wir Customize Hardware und wechseln unter Network Adapter die Option Network Connection zu Bridged
  • Im Dialog zur Hardware fügen wir zusätzlich Floppy Drive hinzu. Je nach Möglichkeit verwenden wir ein physisches Diskettenlaufwerk (gibt es noch mit USB) oder vorab erstellten Images von Disketten.

vmware_start_dialogvmware_newmachine_assistant01vmware_newmachine_assistant02vmware_newmachine_assistant03vmware_newmachine_assistant04vmware_newmachine_assistant05vmware_newmachine_assistant06vmware_newmachine_assistant07vmware_newmachine_assistant08vmware_newmachine_assistant09vmware_newmachine_assistant10vmware_newmachine_assistant11vmware_newmachine_assistant12vmware_newmachine_assistant13

Anschließend starten wir die vorbereitete VM. Wichtig ist natürlich die erste Diskette der drei Installationsdisketten von MS-DOS 6.22 in die VM einzubinden.

Als erstes wird die Festplatte zur Installation von MS-DOS 6.22 vorbereitet. Danach erfolgt ein erster Neustart. Danach startet der Installationsdialog für MS-DOS 6.22 und wir wechseln nach jeder Aufforderung die Disketten physisch oder wenn als Image mittels: Player -> Removable Devices -> Floppy -> Settings.
Hinweis: Mit STRG + ALT könnt ihr die VM „verlassen„.

vmware_msdos_install01vmware_msdos_install02vmware_msdos_install03vmware_msdos_install04vmware_msdos_install05vmware_msdos_install06vmware_msdos_install07vmware_msdos_install08vmware_msdos_install09vmware_msdos_install10

Nach der dritten Diskette entfernen wir diese und starten in der VM das System mittels STRG + ALT + Einfg neu:

vmware_msdos_running01

Für die Nicht-alten Hasen zur Nutzung von MS-DOS 6.22 ein paar Befehle als Beispiel:

Wechsel ins Unterverzeichnis net: cd net 
Editieren der Datei system.ini im aktuellen Verzeichnis: edit system.ini
Wechsel ins darüberliegende Verzeichnis: cd ..
Ausgabe der Hilfe von net start: net start /? | more
Erstellene eines Verzeichnis: mkdir disk1
Dateien von Disketten ins Verzeichnis c:\disk1 kopieren: copy a:\*.* c:\disk1\*.*
Alle Dateien im Verzeichnis mit Unterverzeichnisse auflisten und bei Bedarf pausieren: dir /s /p
Alle Dateien mit PWL als Dateiendung löschen: del *.PWL
Microsoft Diagnose-Program starten: msd
Schließen von Programmen - häufig: F3-Taste
Schließen von Programmen: STRG + C
Aufruf Tool zur Speicheroptimierung (unter vmware bitte nicht anwenden): memmaker
Alle Dateien ohne Dateiendung oder Verzeichnisse im aktuellen Verzeichnis auflisten: dir *.
Alle Dateien mit Dateiendung exe im aktuellen Verzeichnis auflisten: dir *.exe
Alle Dateien mit Dateiendung sy? im aktuellen Verzeichnis auflisten: dir *.sy*
Datei/Befehl setup.bat, setup.cmd oder setup.exe ausführen: setup
Wechsel zum Diskettenlaufwerk: a:
Wechsel zur Festplatte: c:

Vorbereitung Installation MS Network Client 3.0 und Treiber:

Der Treiber für die Netzwerkkarte kann von dieser Quelle:

http://support.amd.com/en-us/search/utilities

vmware_network_driver_download01

heruntergeladen werden. Alternativ gibt es den Treiber unter:

https://www.mpl.ch/t28213.html

Dateiname: dos_ibmados.exe, Bemerkung: NDIS2 driver for IBMADOS

Der Download von MS Network Client 3.0 ist hierbei etwas schwieriger, da die Download-Quellen kaum verfügbar sind:

ftp://ftp.microsoft.com/bussys/Clients/MSCLIENT/

herunterladen.

Alternativ als rar-gepackte Variante:

http://www.kompx.com/soft/dos/networking/msnc/3.0/msnc3.0.rar

oder auf den Installations-CDs von MS WindowsNT.

Als Ergebnis müssen zum Client folgende Dateien vorliegen:

  • DSK3-1.exe
  • DSK3-2.exe

Zur Nutzung dieser Dateien diese direkt auf Diskette schreiben oder mittels geeignetem Tool eine virtuelle Diskette erstellen und diese Dateien in das Image einbinden.

Hinweis: Bei der Variante mit virtuellen Disketten konnte ich das Shareware-Tool: WinImage erfolgreich testen (Download-Quelle: http://america.winimage.com/download.htm). Eine Alternative ist mir derzeit nicht bekannt.

Hinweis zur Verwendung von WinImage und dem Erstellen virtueller Disketten:

  • Diskettengröße setzen: Image -> Change format … -> 1.44 MB
  • Diskette als IMA speichern: File -> Save as -> Dateityp: Image file (*.ima)
  • Dateiendung anschließend von .ima zu .img ändern

Die zwei Dateien DSK3-1.exe und DSK3-2.exe habe ich anschließend zur Sicherstellung der Kompatibilität unter MS-DOS entpackt und erneut auf einzelne Disketten geschrieben (Hinweis: Option read-only in der VM für Disketten deaktivieren). Unter MS-DOS wurden hierzu die folgenden Befehle der Reihe nach ausgeführt:

c:
cd \
mkdir disk1
mkdir disk2
copy a:\dsk3-1.exe c:\disk1\*.*
copy a:\dsk3-2.exe c:\disk2\*.*
cd disk1
dsk3-1.exe
del dsk3-1.exe
format a:
copy c:\disk1\*.* a:\*.*

Neue Diskette einlegen/einbinden.

cd \
cd disk2
dsk3-2.exe
del dsk3-2.exe
format a:
copy c:\disk2\*.* a:\*.*

Bereinigen der Verzeichnisse:

c:
cd \
del disk1
del disk2
rmdir disk1
rmdir disk2

Neben den Disketten für MS Network Client 3.0 habe ich den Treiber entpackt und auf einer weiteren Diskette gespeichert.

 

Installation MS Network Client 3.0 und Treiber:

Jetzt erfolgt die Installation von MS Network Client und dem Treiber. Als erstes binden wir die erste Diskette für MS Network Client ein und starten das Setup mittels:

a:
setup

Das Standard-Ziel zur Installation bleibt c:\NET

vmware_msdos_msnetworkclient_installation01

Als Adapter wählen wir: *Network adapter not shown on list below

vmware_msdos_msnetworkclient_installation02

Jetzt legen wir die Diskette mit den Treiber-Dateien ein und bestätigen mit ENTER:

vmware_msdos_msnetworkclient_installation03

Anschließend wählen wir AMD Pcnet family Ethernet controllers:

vmware_msdos_msnetworkclient_installation04

Zur Abfrage bzgl. Performance wählen wir mittels ENTER die beste Performance.

vmware_msdos_msnetworkclient_installation05

Im darauffolgendem Fenster werden wir nach einem Benutzer gefragt, der neben Benutzername auch der Computername im Netzwerk für unser System wird:

vmware_msdos_msnetworkclient_installation06

Hier empfiehlt es sich den späteren Benutzernamen zum Zugriff auf die Freigabe zu verwenden. Der Benutzername sollte bereits jetzt nicht als Computername im Netzwerk vorliegen!

Nach diesem Vorgang müssen wir zunächst das Protokoll auf TCP/IP ändern. Hierzu wählen wir Change Network Configuration:

vmware_msdos_msnetworkclient_installation07

Im neuen Fenster gehen wir mittels Pfeiltasten auf Remove und wechseln anschließend mit einmaliger Verwendung der TAB-Taste in den oberen Bereich und wählen NWLink IPX Compatible Transport aus. Erneut ENTER:

vmware_msdos_msnetworkclient_installation08

Jetzt drücken wir ENTER und wählen im neuen Fenster Microsoft TCP/IP aus:

vmware_msdos_msnetworkclient_installation09

Anschließend bestätigen wir Network configuration is correct. und The listed options are correct.

vmware_msdos_msnetworkclient_installation10

vmware_msdos_msnetworkclient_installation11

Jetzt beginnt ein Diskettenwechsel-Marathon. Wir legen nun in folgender Reihenfolge die Disketten ein und bestätigen immer anschließend mit ENTER:

  • Diskette 1 MS Network Client 3.0
  • Diskette mit Netzwerktreiber
  • Diskette 2 MS Network Client 3.0
  • Diskette 1 MS Network Client 3.0

vmware_msdos_msnetworkclient_installation12

vmware_msdos_msnetworkclient_installation13

vmware_msdos_msnetworkclient_installation14

Anschließend entfernen wir die zuletzt verwendete Diskette und starten das System durch. Wir erhalten nach wenigen Sekunden:

vmware_msdos_network01

Wir sehen zunächst unsere MAC-Adresse im Netzwerk. Zusätzlich werden Benutzername und Passwort abgefragt. Anschließend besteht die Möglichkeit, das Passwort zu speichern. Hier ein kleiner Hinweis zur Passwortsicherheit: Bloß nicht Passwörter verwenden, die bereits verwendet werden und sogar kritisch sind. Die Passwortsicherheit unter MS-DOS geht für heutige Verhältnisse gegen null.

vmware_msdos_running02

Jetzt prüfen wir unser System. Als erstes können wir die bestehende Netzwerk-Adresse abfragen:

ipconfig c:\net

vmware_msdos_running03

Zur weiteren Verwendung und Konfiguration sehen wir uns die folgenden Dateien an:

edit c:\net\system.ini

vmware_msdos_running04

vmware_msdos_running05

Hinweis: Zur Navigation im Editor sind die Tasten ALT für Menüaufruf, ESC zum Schließen der Menüs und TAB zum Springen zwischen den Dialogen wichtig.

edit c:\net\protocol.ini

vmware_msdos_running06

edit c:\autoexec.bat

vmware_msdos_running07

Die folgenden Optionen in den drei Dateien sind für uns wichtig:

computername=
lanroot=C:\NET
username=
*Shares=
MSDOS=

Mit den drei ersten Optionen können wir den Computernamen für unseren MS-DOS-PC und den Standard-Benutzername zur Verwendung im Netzwerk steuern. lanroot ist zum Beispiel beim Abruf der IP-Adresse mittels ipconfig wichtig:

vmware_msdos_running08

Korrekt ist daher zur Verwendung: ipconfig c:\net

Mittels *Shares= und MSDOS=, bzw. BENUTZERNAME= erfolgt ein Verweis auf die Passwortlisten.

SubNetMask0=
IPAddress0=
DisableDHCP=

Mittels DisableDHCP=1 und korrekten Werten für IPAddress0 und SubNetMask0 kann eine feste IP-Adresse im Netzwerk vergeben werden.

c:\Net\net start

startet automatisch zum PC-Start den Netzwerkdienst und fragt immer die Verwendung des Benutzernamens und Passworts ab. Wer dies umgehen möchte und vereinfacht zum Start die Freigabe vom Server als Laufwerk einbinden möchte, kann die autoexec.bat wie folgt ändern:

vmware_msdos_running09Hinweis: IP-Adresse als Servername funktioniert nicht!

Nach erneutem Start des PCs sehen wir:

vmware_msdos_running10

… und können anschließend auf die Dateien auf unserem MS Windows Server 2012R2 zugreifen:

vmware_msdos_running12

 

Hilfestellung:

  • Wenn nach Abschluss der Installation erneut das Setup ausgeführt werden muss und ggf. die Meldung kommt, dass nicht ausreichend Speicher zur Verfügung steht, muss meist nur der Netzwerkdienst gestoppt werden:

    net stop
    
  • Wer nicht ausreichende Zugriffsrechte auf die Freigabe hat bekommt keinerlei Fehlermeldung. Die Freigabe wird erfolgreich mit dem Laufwerk unter DOS verbunden. Bei Prüfung sehen wir lediglich ein leeres Verzeichnis:
    vmware_msdos_NOerror
  • Wer versucht IP-Adressen direkt zu verwenden bekommt folgende Meldung:vmware_msdos_Error53
    Lösung ist die Verwendung des Namens zum PC. Wer zusätzlich Probleme mit DNS hat muss in der hosts die IP-Adresse des Ziels mit dem Namen zum Server entsprechend hinterlegen:

    edit c:\net\hosts

    vmware_msdos_hosts

  • Wer versucht eine nicht existierende Freigabe zu verbinden bekommt folgende Fehlermeldung:
    vmware_msdos_error67
  • Wer statt net use eine GUI verwenden möchte, kann dies mittels dem Befehl net machen:
    vmware_msdos_net_command

 

Meine Quellen, hilfreiche Befehlsreferenzen, genutzte Tools:

 

PRTG – bash Skript zur Abfrage am Linux-Server – XML-Datensatz

Bei Einsatz von PRTG zur Überwachung von Systemen in einem Netzwerk können bei Bedarf eigene Skripte aktiviert werden, wo die gewünschten Daten/Informationen via XML ausgegeben werden.

In meinem Beispiel benötigte ich einen einfachen Sensor, wo ich als Ergebnis, zu einer Liste von Verzeichnissen, die Anzahl der Dateien und die Gesamtgröße mit allen Unterverzeichnisse als Datensatz bekomme. Ziel war es eine Fehlermeldung zu generieren und per E-Mail zu erhalten, um entsprechende Massnahmen durchführen zu können.

Damit das eigene Skript auf dem Server verfügbar ist, erstellen wir zunächst im Verzeichnis /var/prtg/scriptsxml auf dem betroffenen Server eine Datei mit sinnvollen Namen:

nano getfolderinfo

und fügen den folgenden Inhalt ein:

#!/bin/bash

echo "<?xml version=\"1.0\" encoding=\"Windows-1252\" >"
echo "<prtg>"

for i do

foldersize=$(du -s "$i" | cut -f1)
filescount=$(find "$i" -type f | wc -l)

 echo "<result>"
  echo "<channel>$i - folder size</channel>"
  echo "<value>$foldersize</value>"
  echo "<volumeSize>Byte</volumeSize>"
 echo "</result>"

 echo "<result>"
  echo "<channel>$i - files count</channel>"
  echo "<value>$filescount</value>"
 echo "</result>"

done

echo "</prtg>"

Anschließend machen wir die Datei ausführbar mittels:

chmod 755 getfolderinfo

 

Zur Info:

Mittels:

for i do
  ...done

werden die übergebene Argumente in einer Schleife abgearbeitet.

Mittels:

foldersize=$(du -s "$i" | cut -f1)
filescount=$(find "$i" -type f | wc -l)

werden die jeweiligen Informationen in Variablen geschrieben. Die restlichen Zeilen erzeugen die notwendige XML-Struktur.

 

Zum Test führen wir das Skript mit einem Argument aus, wobei das Argument als Verzeichnis auf dem Server vorliegen muss:

prtg_sensor_script_output

 

Anschließend aktivieren wir im PRTG den neuen Sensor. Hierzu wird zu einem bereits bestehenden Linux-System ein weiterer Sensor hinzugefügt. Zur Auswahl des Sensors wählen wir SSH Script Advanced:

prtg_sensor_sshxml

Im nächsten Schritt wählen wir das Skript auf dem Server:

prtg_sensor_select

Hinweis: Hier erscheint auch der Hinweis wo sich das Skript auf dem Server befinden muss!

und hinterlegen die zu prüfenden Verzeichnisse mit Leerzeichen getrennt als Parameter:

prtg_sensor_select_parameters

Anschließend schließen wir die Eingabe ab und warten mindestens zweimal die Zeit für das Aktualisierungsinterval ab, damit die Struktur vom Sensor via XML erfasst und anschließend mit ersten Daten befüllt wird.

Im Ergebnis und mit ein paar Anpassungen für aktivierte Grenzwerte (Limits -> Enable Limts) in der Spalte Settings zum jeweiligen Kanal (Beispiel):

  • Upper Error Limit (#): 1
  • Error Limit Message: … Aufnahmen (Bilder oder Video) …

sehen wir:

prtg_sensor_output.jpg

Wer einen Sensor mit bereits festen Vorgaben für Grenzwerte erstellen möchte, siehe sich bitte das Handbuch mit mindestens 3000 Seiten an:

https://www.de.paessler.com/support/manuals

Ansonsten ist die Datei: Demo Batchfile – Returns static values in four channels.bat auf dem PRTG-Server unter C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML eine gute Grundlage für die jeweiligen XML-Tags.

Weitere Quellen/Links:

 

Citrix GoToMeeting-Probleme in einer gemischten Struktur mit Verwendung eines Proxy

Mittels Citrix GoToMeeting ist es möglich Meetings mit Bildübertragung durchzuführen. Leider ist durch ein automatisches Update, der Software unter MS Windows, die korrekte Nutzung über einen Proxy derzeit nicht möglich.

In Umgebungen, wo für einzelne PCs die direkte Nutzung ohne Proxy aktiviert wurde, ist es möglich ein erneutes Setzen der Proxy-Einstellungen via GPO zu verhindern. Jedoch kann es passieren dass die Proxy-Einstellungen über Benutzerprofile synchronisiert werden.

Zusätzlich übernimmt Mozilla Firefox sehr gerne die Proxy-Einstellungen vom Internet Explorer und auch Citrix GoToMeeting prüft zum Start auf vorhandenen Proxy-Einstellungen im Internet Explorer und Mozilla Firefox.

Im Ergebnis ist es sehr schwierig GoToMeeting mitzuteilen dass kein Proxy notwendig ist. Zur Lösung im Problemfall müssen per Hand die Prozesse von GoToMeeting (beginnend g2m*) beendet werden. Anschließend müssen die Proxy-Einstellungen in den Web Browsern deaktiviert werden. Zum Ende müssen noch die Registrierungswerte unterhalb HKEY_CURRENT_USER\SOFTWARE\Citrix gelöscht werden. Anschließend kann GoToMeeting gestartet werden.

Als Alternative habe ich hierzu folgendes Skript geschrieben, welches erfolgreich unter MS Windows 7 und MS Windows 10 getestet wurde. Dies kann entweder per Hand gestartet oder zur Benutzeranmeldung an bestimmten Systemen ausgeführt werden.

Hinweis: Zur Ausführung werden Mozilla Firefox und Internet Explorer automatisch beendet!

 

@echo off
SETLOCAL ENABLEEXTENSIONS
set killtasks=g2mcomm.exe g2mlauncher.exe g2mstart.exe iexplore.exe firefox.exe


:KILLTASKS

(for %%a in (%killtasks%) do (
 echo try: taskkill /IM %%a /F
 taskkill /IM %%a /F
 )
)

(for %%a in (%killtasks%) do (
 echo try: taskkill /IM %%a /F
 taskkill /IM %%a /F
 )
)


:INTERNETEXPLORER

REG ADD "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d "0" /f
REG DELETE "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyOverride" /f
REG DELETE "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v "AutoConfigURL" /f
REG DELETE "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyServer" /f


:FIREFOX

cd /D "%APPDATA%\Mozilla\Firefox\Profiles"
cd *.default*

set cd=%CD%
set file=%CD%\prefs.js

For /f "tokens=3 delims=." %%a in ('date /t') do (set sDateTime=%%a)
For /f "tokens=1-2 delims=." %%a in ('date /t') do (set sDateTime=%sDateTime:~0,4%_%%b_%%a)
For /f "tokens=1-2 delims=:" %%a in ('time /t') do (set sDateTime=%sDateTime%_%%a_%%b)

set backup=%CD%\prefs.js_%sDateTime%

if EXIST %file% ( copy %file% %backup% /Y )
if EXIST %backup% ( type %backup% | findstr /v "network.proxy" > %file% )

echo type %file% | findstr "network.proxy"
type %file% | findstr "network.proxy"
if %ERRORLEVEL% neq 0 ( echo user_pref^(^"network.proxy.type^", 0^); >> %file% )


:GOTOMEETING

Reg Delete "HKEY_CURRENT_USER\SOFTWARE\Citrix" /f


:END

 

Hinweis:

Die Prozesse werden bewusst doppelt beendet, da sie sich gegenseitig überwachen und teilweise erneut gestartet werden. Für mögliche Probleme beim Arbeiten mit der prefs.js vom Firefox, wird hier auf Basis von Datum und Uhrzeit eine Kopie verwendet, die nicht gelöscht wird. Sofern eine Löschung erfolgen soll, kann dies am Ende des Skript mittels:

del %backup%

erfolgen.

Wer lediglich eine Lösung zur Deaktivierung der Proxy-Einstellungen im Internet Explorer und Mozilla Firefox sucht, muss einfach nur die ersten zwei Zeilen plus die Zeilen nach :FIREFOX, bzw. :INTERNETEXPLORER verwenden.

 

 

 

OCS NG Agent – Verbessertes Install-Skript

Zur Verteilung des Agent war mir aufgefallen, dass bei recht vielen Clients die Softwareaktualisierung erfolgreich ist, nicht jedoch unmittelbar danach der Dienst und zwei Prozesse aktiviert werden. Zur Lösung des Problems habe ich folgende kleine Batch-Datei geschrieben. Diese Datei muss ins gleiche Verzeichnis mit den Dateien ocslogon.exe und ocspackage.exe kopiert werden. Bei Ausführung wird ocslogon.exe mit dem Parameter der Mindestversion des Clients gestartet. Anschließend wird über eine Schleife geprüft, ob Prozesse zur Installation noch aktiv sind. Wenn diese beendet sind, wird geprüft, ob die Prozesse zum Agent laufen, wenn nicht werden diese gestaret.

@echo off
setlocal enabledelayedexpansion

set MYPATH=%~dp0
set PATHOCSINVENTORY=("%ProgramFiles%\OCS Inventory Agent\" "%ProgramFiles(x86)%\OCS Inventory Agent\")
set OCSRUNNINGPROCESS=(Ocsinventory.exe OcsSystray.exe)
set OCSLOGONPROCRESS=ocslogon.exe
set OCSSERVICE="OCS Inventory Service"
set INSTALLPROCESSES=(instOCS.exe OcsSetup.exe OCS-NG_Agent_setup.exe)

:setDisableUNCCheck
reg add "HKCU\SOFTWARE\Microsoft\Command Processor" /v DisableUNCCheck /t REG_DWORD /d 1 /f

:runOcsLogon
%MYPATH%\ocslogon.exe /GPO /PACKAGER /NP /DEBUG=2 /DEPLOY=2.1.1.3 /NOW

:LOOP
for %%p in %INSTALLPROCESSES% do (
    tasklist /fi "IMAGENAME eq %%p" 2>NUL | find /I /N "%%p">NUL
    if "!ERRORLEVEL!"=="0" (
        echo Programm %%p is running
        GOTO LOOP
        )
    )

ping -n 1 127.0.0.1 > nul

:CheckRunningProcesses
for %%r in %OCSRUNNINGPROCESS% do (
    tasklist /fi "IMAGENAME eq %%r" 2>NUL | find /I /N "%%r">NUL
    if "!ERRORLEVEL!"=="1" (

        echo try to run program %%r

        for %%p in %PATHOCSINVENTORY% do (
            if exist %%p (
                start "" %%p%%r
                )
            )        

        ) else (
            echo programm %%r is running
        )
    )


net start %OCSSERVICE%

ping -n 2 127.0.0.1 > nul

Suchen in PDF-Dateien, wenn Text falsch kodiert oder als Bild gespeichert ist

Es kann gelegentlich vorkommen, dass in PDF-Dateien der Text zwar korrekt lesbar ist, aber der Inhalt nicht über die Suchfunktion durchsucht werden kann. Dies kann vorkommen, wenn der Text als Bild gespeichert ist oder der Text falsch kodiert wurde.

Hier bietet die kostenlose Version von PDF X-Change Viewer eine Lösung. Zum Test habe ich im Programm notepad einfach ein Text Das ist ein Test geschrieben. Dies als Bild in eine Word-Datei kopiert und anschließend als PDF gespeichert.

In dieser Form ist die Suche nach Text nicht möglich.

Zur Lösung die PDF mittels PDF X-Change Viewer öffnen, dann im Menü Dokument Text erkennen … auswählen.

PDF-XChangeViewer_OCR_TestPDF

Im anschließend erscheinenden Dialog unter Ausgabe, PDF-Ausgabe Originalinhalt in ein Bild konvertieren & Textebene hinzufügen auswählen. Zusätzlich unter Erkennung, Hauptsprache die Sprache auswählen.

PDF-XChangeViewer_Option_Texterkennung

Anschließend kann der erkannte Text durchsucht werden.

PDF-XChangeViewer_Test

Kleiner Hinweis: Mittels PDF X-Change Viewer können PDFs auch als Bild (TIFF) gespeichert werden. Dieses Format können auch andere OCR-Texterkennungsprogramme einlesen und verarbeiten.

EmulationStation unter Windows für unterwegs

Der heutige Beitrag ist aus einem kleinen Projekt entstanden. Ziel ist es, zum Beispiel an einem Notebook und ggf. Videoprojektor im Garten mit Freunden sitzen zu können und die alten Computerspiele aus der Kindheit zu spielen. Einfach nur aus Spaß.

Damit alles angemessen „präsentiert“ werden kann, empfiehlt es sich mit Emulation Station zu befassen.

Siehe hierzu: http://www.emulationstation.org

Damit die Einrichtung nicht für alle Windows basierenden Systeme erneut durchgeführt werden muss, empfiehlt es sich dies als portable Lösung zu realisieren. Hier zusammenfassend meine Lösung.

Als Basis verwende ich einen älteren PC von ca. 2009, mit SSD und aktuellem Windows 10 (64bit). Als Controller verwende ich einen Xbox 360-Controller mit USB-Adapter.

Die Einrichtung ist jedoch nicht ganz trivial und es sind mehrere Aspekte zu beachten. Der zeitliche Aufwand zur Einrichtung, sobald das System verstanden wurde, ist jedoch überschaubar.

Zur Einrichtung von mir verwendete Tools sind:

Download und Vorbereitung EmulationStation

Zu Beginn laden wir für Windows die Variante zip file über folgende Seite:

http://emulationstation.org/#download

emulatorstation_download

herunter und entpacken diese. Den Inhalt speichern wir direkt auf einem USB-Stick im Verzeichnis emulationstation:

emulatorstation_extract

Anschließend starten wir als erstes launch_portable.bat und bekommen folgende Meldung, dir wir mit ENTER wieder schließen:

emulatorstation_firstrun

Im Unterverzeichnis .emulationstation finden wir jetzt zwei Dateien, die uns im späteren Verlauf helfen und benötigt werden:

emulatorstation_firstrun_files

In der es_systems.cfg haben wir jetzt ein Beispiel zur Steuerung und Hinterlegung der Systeme, die wir gerne über Emulatoren etc. nutzen wollen:

emulatorstation_firstrun_es_systems_cfg

Hilfe zur Einrichtung des Systems finden wir auf der Seite von retroarch. Hier sind ein paar sehr gute Beispiele dokumentiert:

https://github.com/HerbFargus/EmulationStation_Windows/wiki/Portable-Emulationstation

Zur vereinfachten Übernahme bereinigen wir zunächst die erstellte es_systems.cfg:

<!– This is the EmulationStation Systems configuration file.
All systems must be contained within the tag.–>

<systemList>

~\.emulationstation\roms

</systemList>

Danach übernehmen wir von retrocharch als Beispiel:

emulatorstation_retroarch_es_systems_cfg_samples

und erhalten somit:

<!-- This is the EmulationStation Systems configuration file.
All systems must be contained within the  tag.--><systemList>

~\.emulationstation\roms

<system>
    <name>snes</name>
    <fullname>Super Nintendo Entertainment System</fullname>
    <path>~\.emulationstation\roms\snes</path>
    <extension>.smc .sfc .SMC .SFC</extension>
    <command>%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "%ROM_RAW%"</command>
    <platform>snes</platform>
    <theme>snes</theme>
</system>

</systemList>

 

Gemäß den Beispielen übernehmen wir in unserem Dateisystem die hier übernommen Strukturen in den Tags path und command. Daher erstellen wir zwei Unterverzeichnisse innerhalb .emulationstation (unbedingt das Verzeichnis mit dem beginnenden Punkt verwenden):

  • roms
  • systems

Im Verzeichnis roms erstellen wir jetzt das Verzeichnis snes und hinterlegen ein von uns bereits besitzendes ROM mit einer der notwendigen Erweiterung wie im Tag extension

smc .sfc .SMC .SFC

aufgeführt. Zum Test von EmulationStation reicht jedoch zunächst eine leere Datei mit einem Namen und entsprechender Erweiterung. Ich verwende hierbei:

Beispiel Textdatei.smc

Zusätzlich benötigen wir mindestens ein passendes System.

Hinweis: Ist das Verzeichnis für die ROMs nicht korrekt, so wird später beim Start von EmulationStation gemeldet, dass kein System gefunden werden konnte, obwohl das System korrekt hinterlegt ist. Für EmulationStation ist ein System erst vorhanden, wenn auch das Verzeichnis für die ROMs korrekt ist. Weitere Hinweise später unter: Hinweise zur Fehlersuche und bekannte Probleme.

Download und Vorbereitung retroarch

Zunächst laden wir die aktuelle stablie Version vom Projekt retroarch herunter:

https://github.com/HerbFargus/EmulationStation_Windows/wiki/Portable-Emulationstation

Wählen HERE direkt nach You can either download the stable version:

emulatorstation_retroarch_download

Dann win-x64 für Windows mit 64bit:

emulatorstation_retroarch_download02.jpg

und anschließend die entsprechende 7z-Datei:

emulatorstation_retroarch_download03

Die 7z-Datei entpacken wir anschließend mit dem zum Beginn des Eintrags aufgeführten Tool 7-zip und verschieben anschließend die Dateien in ein neues Verzeichnis retroarch unterhalb des Verzeichnis systems:

emulatorstation_retroarch_extract

 

Wichtiger Hinweis: Zu empfehlen ist an dieser Stelle, dass die retroarch.cfg gesichert wird. Fehler beim Mapping von Tasten etc. können das weitere Verwenden von retroarch verhindern.

Damit wir anschließend beim Aufruf von EmulationStation auch die benötigten Emulatoren nutzen können, benötigen wir zunächst den jeweiligen Core. Welcher benötigt wird und ggf. welcher der richtige ist, sehen wir anhand der Parameter im command-Tag der es_systems.cfg

%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "%ROM_RAW%"

Zum Download der Cores starten wir daher retroarch über die retroarch.exe

emulatorstation_retroarch_config_cores01

Zur Navigation verwenden wir folgende Tasten auf der Tastatur:

  • Pfeiltasten zur Steuerung in den Menüs
  • x zur Auswahl
  • y zum Wechsel in überliegendes Menü

Bei meinem XBox 360-Controller sind dies B für Auswahl und A für Zurück.

Wir wählen zum Download des hier benötigten Cores Online Updater aus:

emulatorstation_retroarch_config_cores02

Core Updater:

emulatorstation_retroarch_config_cores03

Jetzt suchen wir in der Liste den wahrscheinlich richtigen Core (leider nicht eindeutig erkennbar):

emulatorstation_retroarch_config_cores04

In meinem Beispiel ist es SNES / Super Famicon (Snes9x Next):

emulatorstation_retroarch_config_cores05

Anschließend sehen wir kurz den Download der Datei zum Core:

emulatorstation_retroarch_config_cores06

Zur Prüfung, ob wir den richtigen Core erwischt haben, wechseln wir hier in das Unterverzeichnis cores:

emulatorstation_retroarch_cores01

und vergleichen den Dateinamen mit dem Namen der aufzurufenden Datei zum -L -Argument im command-Tag:

-L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll

Perfekt!

Wichtiger Hinweis: Während meiner Tests hatte sich der Name der dll-Datei geändert. Ggf. ist es auch bei euch der Fall. Unbedingt vergleichen und korrigieren!

 

Erster richtiger Start von EmulationStation

Jetzt starten wir EmulationStation erneut über launch_portable.bat. Wer einen Controller hat, bitte vorab einschalten.

Wenn alles in Ordnung ist (es befindet sich mind. eine entsprechende ROM-Datei mit passender Dateiendung im richtigen roms-Verzeichnis), sehen wir eine der folgenden Meldungen:

emulatorstation_secondrun.jpg

oder

emulatorstation_secondrun_gamepad

Mit einem langen Tastendruck des jeweiligen Controller (auch bei Tastatur) kann die Steuerung eingerichtet werden.

ACHTUNG: Das sich öffnende Menü ist kein Menü. Es wird hier sofort die richtige Taste zur Eingabe verlangt.

In meinem Fall musste ich nach meinem Fehlversuch mit ALT + F4 das Fenster über die Tastatur schließen und habe die Einrichtung der Eingabe über einen erneuten Start erfolgreich durchgeführt.

Wer jetzt einen Fehler gemacht hat, kann entweder im LOG das Mapping einsehen (es_log.txt). Beispiel:

lvl2: Configuring device 0 (XInput Controller #1).
lvl2: Mapping [Button 0] -> Up
lvl2: Mapping [Button 1] -> Down
lvl2: Mapping [Button 2] -> Left
lvl2: Mapping [Button 3] -> Right
lvl2: Mapping [Button 10] -> A
lvl2: Mapping [Button 11] -> B
lvl2: Mapping [Button 4] -> Start
lvl2: Mapping [Button 5] -> Select
lvl2: Mapping [Button 8] -> PageUp
lvl2: Mapping [Button 9] -> PageDown

um mit dieser Info die richtigen Tasten zur Navigation zu nutzen oder verwendet einen anderen Controller oder löscht die Datei es_input.cfg im Verzeichnis .emulationstation

Danach sehen wir:

emulatorstation_secondrun_snes_theme

und nach Auswahl:

emulatorstation_secondrun_snes_gamelist01

Nach dem Aufruf von retroarch müssen wir ggf. einmalig manuell in den Vollbildmodus wechseln. Innerhalb von retroarch kann mit der F1-Taste ins Menü gewechselt werden. Die weiteren F-Tasten haben auch entsprechenden Funktionen. Mit der Taste f kann zwischen Vollbild und Fensteransicht gewechselt werden.

Als Beispiel bei erfolgreichem Aufruf sehen wir:

emulatorstation_retroarch_game01.jpg

Wer jetzt den Emulator beenden möchte, kann dies entweder über das Menü mit F1 machen oder einfach die ESC-Taste kurz drücken.

Jetzt wo wir den Aufruf erfolgreich getestet haben, löschen wir in den ROMs Beispiel Textdatei.smc  und starten erneut EmulationStation. Sofern jetzt weiterhin Beispiel Textdatei zur Auswahl zur Verfügung steht, kann jetzt die Datei gamelist.xml im entsprechend passenden ROM-Verzeichnis unter .emulationstation\gamelists\ löschen.

In meinem Beispiel befindet sich die Datei unter:

  • emulationstation\.emulationstation\gamelists\snes

Der Inhalt ist folgender:

<?xml version="1.0"?>
<gameList>
    <game>
        <path>./Beispiel Textdatei.smc</path>
        <name>Beispiel Textdatei</name>
        <playcount>1</playcount>
        <lastplayed>20170207T202234</lastplayed>
    </game>
    <game>
        <path>./Donkey Kong Country 1.smc</path>
        <name>Donkey Kong Country 1</name>
        <playcount>2</playcount>
        <lastplayed>20170207T202234</lastplayed>
    </game>
</gameList>
 

Hinweise zur Fehlersuche und bekannte Probleme:

  • Verwendung des Logs von EmulationStation
    emulationstation\.emulationstation\es_log.txt
  • ggf. fehlender Pfad zu den ROMs in der es_systems.cfg
    ~\.emulationstation\roms
  • fehlendes Verzeichnis für die ROMs gemäß path-Tag der es_systems.cfg oder fehlende ROM-Datei mit passender Endung.
    Beispiel-Meldung im LOG von EmulationStation bei fehlendem Verzeichnis oder fehlendem ROM:

    lvl1: Error - folder with path ""G:/emulationstation//.emulationstation/roms/snes"" is not a directory!
    lvl2: Parsing XML file "G:/emulationstation//.emulationstation/gamelists/snes/gamelist.xml"...
    lvl1: System "snes" has no games! Ignoring it.
    lvl0: No systems found! Does at least one system have a game present? (check that extensions match!)
  • gelöschte Spiele bleiben gelegentlich in der Liste erhaltenauch. Das LOG es_log.txt gibt uns hier entsprechende Informationen
    lvl2:  Parsing XML file "G:/emulationstation//.emulationstation/gamelists/snes/gamelist.xml"...

    Wie bereits beschrieben einfach die gamelist.xml im entsprechen Verzeichnis .emulationstation\gamelists\<system> passend löschen

  • Ist ein Spiel zur Auswahl verfügbar und wird der Emulator unmittelbar nach Auswahl wieder geschlossen, den Aufruf im LOG prüfen:
    lvl2:         %HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "G:\emulationstation\\.emulationstation\roms\snes\Donkey Kong Country 1.smc"

    In meinem Fall war nach einem Update des Core von Retroarch der Name der dll-Datei abweichend. Hier war eine einfach Korrektur in der es_systems.cfg erfolgreich.

Für mögliche Fehler und Probleme ggf. eine Kopie von launch_portable.bat erstellen (Beispiel zu fehlersuche.bat), die erste Zeile belassen, den Pfad aus dem LOG übernehmen und am Ende den Befehl pause einfügen:

Auszug aus dem Log es_log.txt kopieren:

lvl2: %HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "G:\emulationstation\\.emulationstation\roms\snes\Beispiel Textdatei.smc"

und in der fehlersuche.bat einfügen:

set HOME=%~dp0
%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "G:\emulationstation\\.emulationstation\roms\snes\Beispiel Textdatei.smc"
pause

Alles speichern und testen.

 

Erweiterung EmulationStation und retroarch um weitere Emulatoren

Anschließend können weitere Emulatoren über retroarch eingebunden werden. Ich habe dies für Megadrive, ScummVM und DosBox getestet. Leider sind die Ergebnissen für ScummVM und DosBox über retroarch sehr bescheiden. Anbei mein Versuch. Etwas später zeige ich meine Lösung auf.

Zunächst über retroarch die notwendigen Cores heruntergeladen:

emulatorstation_retroarch_cores02

Im Verzeichnis für die ROMs neue Ordner angelegt und die Spiele gespeichert (bei pc und scummvm jeweilis mit Unterordner pro Spiel):

emulatorstation_retroarch_games02

Anschließend die Beispiele von retroarch für Dosbox:

<system>
 <name>pc</name>
 <fullname>PC (x86)</fullname>
 <path>~\.emulationstation\roms\pc</path>
 <extension>.sh .bat .com .exe .SH .BAT .COM .EXE</extension>
 <command>%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\dosbox_libretro.dll "%ROM_RAW%"</command>
 <platform>pc</platform>
 <theme>pc</theme>
</system>

und ScummVM:

<system>
    <name>scummvm</name>
    <fullname>ScummVM</fullname>
    <path>~\.emulationstation\roms\scummvm</path>
    <extension>.bat .BAT</extension>
    <command>~\.emulationstation\roms\scummvm .bat .BAT %HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\scummvm_libretro.dll "%ROM_RAW%"</command>
    <platform>pc</platform>
    <theme>scummvm</theme>
</system>

und Mega Drive:

<system>
    <name>megadrive</name>
    <fullname>Sega Mega Drive / Genesis</fullname>
    <path>~\.emulationstation\roms\megadrive</path>
    <extension>.smd .bin .gen .md .sg .SMD .BIN .GEN .MD .SG</extension>
    <command>%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\genesis_plus_gx_libretro.dll "%ROM_RAW%"</command>
    <platform>megadrive</platform>
    <theme>megadrive</theme>
</system>

übernommen.

Beim ersten Versuch mit Mega Drive und Sonic the Hedgehog konnte ich gleich erfolgreich den ersten Level mit zusätzlichem Leben beenden. In retroarch gleich mit der F2-Taste den aktuellen Status im state slot #1 gespeichert.

Mit F6 und F7 kann zwischen den state slots gewechselt werden und mit F4 wird aus dem jeweiligen state slot der gespeicherte Zustand geladen. Geil, so muss es sein!

 

Mittels retroarch und Core für Dosbox funktionierte zwar der Aufruf zu den Spielen. Die Verzeichnisse werden in Dosbox gemappt, aber es passiert dann nichts mehr. Teilweise erschien die Meldung Datenfile nicht gefunden. Da wo ich ins Eingabefenster springen konnte ist mir aufgefallen, dass mit der Leertaste die Geschwindigkeit massiv erhöht wird. Ein Leerzeichen ist dann schnell mal 20 Zeichen lang. Auch alle anderen Funktionen von retroarch blieben erhalten, was sich sehr ungünstig bei Tastatureingaben verhielt. In dieser Form absolut für mich ungeeignet.

 

Bei der Variante mit retrocharch und dem Core für ScummVM ist ein Starten zunächst überhaupt nicht möglich. Nach vielen Tests in der Kommandozeile war mir aufgefallen, dass mit dem Aufruf von retroarch und dem Core für ScummVM durch:

g:\emulationstation\.emulationstation\systems\retroarch\retroarch.exe -L g:\emulationstation\.emulationstation\systems\retroarch\cores\scummvm_libretro.dll

die anschließende Datei als Parameter, ausgelesen und der Inhalt als Aufrufparameter für ScummVM interpretiert wird. Mir ist derzeit keine Quelle bekannt wo das entsprechend beschrieben wird.

 

Ich habe daher zum Test die Datei Monkey Island 2.scummvm mit folgendem Inhalt erstellt:

"--path=g:\emulationstation\.emulationstation\roms\scummvm\Monkey Island 2" monkey2

Hinweis: Hier muss bereits das Anführungszeichen vor der Option –path bei Langnamen verwendet werden. Alternativ geht es auch ohne Anführungszeichen, wenn hierzu die Kurznamen für Nicht-8Punkt3-Namen verwendet werden. Zum Ermitteln unter Windows in der Kommandozeile folgendes Beispiel:

emulatorstation_window_short_file_names

Für Monkey Island 2 wäre es dann:

--path=g:\emulationstation\.emulationstation\roms\scummvm\Monkey~2 monkey2

Anschließend konnte ich es mit dem Befehl:

g:\emulationstation\.emulationstation\systems\retroarch\retroarch.exe -f -L g:\emulationstation\.emulationstation\systems\retroarch\cores\scummvm_libretro.dll "g:\emulationstation\.emulationstation\roms\scummvm\Monkey Island 2.scummvm"

erfolgreich testen.

Damit dies auch direkt unter EmulationStation möglich ist, habe ich den Eintrag für das System zu:

<system>
    <name>scummvm</name>
    <fullname>ScummVM</fullname>
    <path>~\.emulationstation\roms\scummvm</path>
    <extension>.bat .BAT</extension>
    <command>~\.emulationstation\roms\scummvm .scummvm %HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\scummvm_libretro.dll "%HOME%\.emulationstation\roms\scummvm\%BASENAME%.scummvm"</command>
    <platform>pc</platform>
    <theme>scummvm</theme>
</system>

geändert. Im Ergebnis, bei Aufruf über EmulationStation, konnte ich folgenden Test erfolgreich durchführen:

emulatorstation_retroarch_scummvm_monkey_island_2.jpg

Jedoch habe ich auch hier wieder das Problem, dass ich derzeit nicht die Tastatur verwenden kann und ich bis dato keine Möglichkeit finden konnte, die störenden Funktionen zu deaktivieren. Zusätzlich bin ich noch nicht mit dem Menü in EmulationStation für ScummVM-Spiele zufrieden und das viel größere Problem ist die zum Start notwendige Game ID zu hinterlegen. Diese muss zusätzlich zum erfolgreichen Starten übergeben werden. In meinem Test:

--path=g:\emulationstation\.emulationstation\roms\scummvm\Monkey~2 monkey2

war es monkey2

Ein weiteres Problem ist, dass ich derzeit fest Laufwerk G: in Monkey Island 2.scummvm  hinterlegt habe. Dadurch ist die portable Variante nicht mehr gegeben.

Sollte einer meiner Leser eine Lösung für das beschriebene Tastaturproblem haben, bitte melden. Zum Test in retroarch einfach f für den Wechsel zwischen Vollbild und Fenster verwenden.

 

Erweiterung EmulationStation um DosBox und ScummVM (nicht retroarch)

Durch die leider vorliegenden Probleme mit DosBox und ScummVM als Core in retroarch habe ich im Ordner .emulationstation\systems zwei zusätzliche Verzeichnisse

  • dosbox
  • scummvm

erzeugt. Anschließend laden wir die Dateien zu DosBox und ScummVM herunter:

emulatorstation_dosbox_download.jpg

emulatorstation_scummvm_download.jpg

Diese entpacken wir (auch die exe-Datei von DosBox) und verschieben den Inhalt in das jeweilige zuvor erstellte Verzeichnis. Damit sieht es so aus:

emulatorstation_dosbox_files.jpg

emulatorstation_scummvm_files

Zusätzlich war mir in EmulationStation aufgefallen, dass alle Dateien mit den hinterlegten Erweiterungen als Spiel gezählt werden. Bei Dune sind das immerhin:

emulatorstation_problem_pcgames01.jpg

Damit ich nun pro Spiel nur einen Eintrag habe, waren mehrere Dinge notwendig:

  • Verwendung eines Verzeichnis mit einer Datei pro Spiel – Beispiel: Monkey Island 2.game (kann leer sein)
  • Hinterlegung einer start.bat-Datei pro Spiel im Spieleverzeichnis, wo die notwendigen Befehle zum Start jeweils einmalig hinterlegt werden. Wenn sie fehlt, dann landen wir direkt im Verzeichnis und können manuell das Spiel starten.
  • Korrektur des path– und extension-Tags in der sc_systems.cfg
  • Anpassung command-Tag für den neuen Aufruf von DosBox als System in der es_systems.cfg

 

Um in Zukunft einen geringeren Aufwand zu haben, wenn ich Spiele hinzufüge oder lösche, generiere ich die jeweiligen Dateien mit Dateierweiterung .game.

Hierzu erzeuge ich zunächst ein Verzeichnis batch unterhalb .emulationstation und anschließend im Verzeichnis batch einen Ordner pc.

Damit nun zum Start von EmulationStation die Dateien generiert werden, habe ich die bestehende launch_portable.bat von:

@echo off
set HOME=%~dp0
emulationstation.exe

zu:

@echo off

set HOME=%~dp0
set HOME=%HOME:~0,-1%

:create_pc_gamelist_files
set PCGAMESDIR=%HOME%\.emulationstation\roms\pc
set PCGAMESBATCHDIR=%HOME%\.emulationstation\batch\pc

REM for /f "tokens=*" %%D in ('dir /B "%PCGAMESDIR%"') do del "%PCGAMESBATCHDIR%\%%D.game"
for /f "tokens=*" %%D in ('dir /B /A:D "%PCGAMESDIR%"') do (

echo "%%D" in pc game dir found 
 echo create "%PCGAMESBATCHDIR%\%%D.game" to start
 echo.
 echo. > "%PCGAMESBATCHDIR%\%%D.game"

)

cls

emulationstation.exe

angepasst. Nach dem ersten Start erhalten wir, vorausgesetzt wir haben Spiele im Verzeichnis

emulationstation\.emulationstation\roms\pc

gespeichert, die entsprechenden .game-Dateien.

emulatorstation_batch_pc_gamelist

Damit diese jetzt für die Darstellung in EmulationStation genutzt werden können und das bei Auswahl DosBox gestartet wird passen wir den System-Eintrag in der es_systems.cfg wie folgt an:

<system>
    <name>pc</name>
    <fullname>PC (x86)</fullname>
    <path>~\.emulationstation\batch\pc</path>
    <extension>.game</extension>
    <command>%HOME%\.emulationstation\systems\dosbox\dosbox.exe -exit -fullscreen -c "mount c: '%HOME%\.emulationstation\roms\pc\%BASENAME%'" -c "c:" -c "start.bat" </command>
    <platform>pc</platform>
    <theme>pc</theme>
</system>

Beim Test sehen wir jetzt nur noch die einzelnen Spiele:

emulatorstation_dosbox_solution_reduced_gamelist.jpg

Damit jetzt die jeweiligen Spiele gestartet werden können, erstellen wir im Verzeichnis zum jeweiligen Spiel die start.bat-Datei. Am einfachen Beispiel von Lost Vikings 1 ist der Inhalt:

@echo off
VIKINGS.exe
exit

Hinweis: Durch den abschließenden Befehl exit wird anschließend DosBox beendet.

 

Wenn wir jetzt das Spiel über Emulation Station starten sehen wir (mit ALT+ENTER kann der Vollbildmodus verlassen werden) das Spiel in der DOSBox:

emulatorstation_dosbox_first_run.jpg

 

Erläuterungen und Informationen zur der oben genannten Anpassung in der es_systems.cfg:

<system>
    <name>pc</name>
    <fullname>PC (x86)</fullname>
    <path>~\.emulationstation\batch\pc</path>
    <extension>.game</extension>
    <command>%HOME%\.emulationstation\systems\dosbox\dosbox.exe -exit -fullscreen -c "mount c: '%HOME%\.emulationstation\roms\pc\%BASENAME%'" -c "c:" -c "start.bat" </command>
    <platform>pc</platform>
    <theme>pc</theme>
</system>

Das Verzeichnis ~\.emulationstation\batch\pc und die extension .game werden verwendet, um die Spiele in EmulationStation im Menü darzustellen. Bei Auswahl wird der Befehl im command-Tag ausgeführt:

%HOME%\.emulationstation\systems\dosbox\dosbox.exe -exit -fullscreen -c "mount c: '%HOME%\.emulationstation\roms\pc\%BASENAME%'" -c "c:" -c "start.bat"

Betrachten wir die einzelnen Elemente zum Aufruf haben wir:

  • %HOME%\.emulationstation\systems\dosbox\dosbox.exe
    dosbox.exe wird gestart
  • -exit
    nach beenden soll dosbox geschlossen werden
  • -fullscreen
    die Darstellung erfolgt sofort im Vollbildmodus
  • -c „mount c: ‚%HOME%\.emulationstation\roms\pc\%BASENAME%'“
    in DosBox wird der Befehl mount c: ‚%HOME%\.emulationstation\roms\pc\%BASENAME%‘ ausgeführt, wobei %BASENAME% als Wert den Spielname, wie im Menü von EmulationStation angezeigt, übernimmt.
  • -c „c:“
    in DosBox wird der Befehl zum Wechsel zu Laufwerk c: ausgeführt
  • -c „start.bat“
    in DosBox wird der Befehl zum Starten der start.bat ausgeführt

 

Erläuterungen und Informationen zur Erweiterung der launch_portable.bat:

@echo off

set HOME=%~dp0
set HOME=%HOME:~0,-1%

:create_pc_gamelist_files
set PCGAMESDIR=%HOME%\.emulationstation\roms\pc
set PCGAMESBATCHDIR=%HOME%\.emulationstation\batch\pc

REM for /f "tokens=*" %%D in ('dir /B "%PCGAMESDIR%"') do del "%PCGAMESBATCHDIR%\%%D.game"
for /f "tokens=*" %%D in ('dir /B /A:D "%PCGAMESDIR%"') do (

echo "%%D" in pc game dir found 
 echo create "%PCGAMESBATCHDIR%\%%D.game" to start
 echo.
 echo > "%PCGAMESBATCHDIR%\%%D.game"

)

cls

emulationstation.exe

Mit:

set HOME=%HOME:~0,-1%

wird das unnötige doppelte \ entfernt, welches ich bei meinen Tests immer gesehen habe. Da ich Probleme unter DosBox befürchtet habe, habe ich dies hierdurch korrigiert.

Mit:

for /f "tokens=*" %%D in ('dir /B /A:D "%PCGAMESDIR%"') do (

echo "%%D" in pc game dir found 
 echo create "%PCGAMESBATCHDIR%\%%D.game" to start
 echo.
 echo. > "%PCGAMESBATCHDIR%\%%D.game"

)

durchsuche ich das Verzeichnis, definiert durch:

set PCGAMESDIR=%HOME%\.emulationstation\roms\pc

auf Unterverzeichnisse und erstelle pro Unterverzeichnis eine Datei mit Verzeichnisname als Name plus .game als Dateiendung im definierten Verzeichnis:

set PCGAMESBATCHDIR=%HOME%\.emulationstation\batch\pc

Dadurch wird immer der vorliegende Ordnername vom jeweiligen Spiel der Name in Emulation Station.

Die Zeile:

REM for /f "tokens=*" %%D in ('dir /B "%PCGAMESDIR%"') do del "%PCGAMESBATCHDIR%\%%D.game"

wird durch das am Anfang stehende REM nicht ausgeführt. Wer möchte, dass sein hinterlegtes Verzeichnis von .game-Dateien immer bereinigt wird, damit gelöschte DOS-Spiele auch in EmulationStation nicht mehr zu sehen sind, kann auf eigene Gefahr das REM entfernen!!!

ScummVM direkt als System in EmulationStation

Bei ScummVM gibt es noch die Besonderheit, dass zum Spielaufruf, neben Verzeichnis auch die game id benötigt wird. Mittels der game id erkennt ScummVM die zu ladenden Dateien. Um die game id zu ermitteln kann scummvm.exe mit der Option -z gestartet werden:

G:\emulationstation\.emulationstation\systems\scummvm>scummvm.exe -z

Als Ergebnis bekommen wir ein recht große Liste:

emulatorstation_scummvm_option_z.jpg

Da jeder nur einmalig die Ordnernamen vergibt, habe ich zur Vereinfachung eine Datei createscummvmbatchfiles.bat  geschrieben, die bei Übergabe eines Namen/Ordnernamen die game id zurückliefert. Diese Datei wurde anschließend im Verzeichnis:

emulationstation\.emulationstation\batch

gespeichert.

Inhalt von createscummvmbatchfiles.bat

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

set args=%*
set args=!args:"=!
set args=!args:  = !
set args=!args: Talkie=!
set gameid=none

set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe

for /f "tokens=*" %%S in ('"%SCUMMVMEXE%" -z ') do (
 set line=%%S
 set line=!line::=!
 set line=!line:/= !
 REM echo !line!

 set test=!line:%args%=!

 if NOT "!line!" == "!test!" ( 

 for /f "tokens=1*delims= " %%i in ("!line!") do (
 set gameid=%%i
 goto output
 )

 )

 )

:output
echo !gameid!

 

Zusätzlich erzeuge ich ein Verzeichnis scummvm unterhalb:

emulationstation\.emulationstation\batch

in welchem später die generierten Startdateien für ScummVM plus Speicherort ScummVM-Spiele und ScummVM-Savegames (Standard wäre innerhalb des Benutzerprofils und somit nicht mehr „portable“) durch folgende Erweiterung der launch_portable.bat gespeichert werden.

:create_scummvm_game_bat
SETLOCAL ENABLEDELAYEDEXPANSION

set SCUMMVMGAMESDIR=%HOME%\.emulationstation\roms\scummvm
set SCUMMVMBATCHDIR=%HOME%\.emulationstation\batch\scummvm
set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe
set SCUMMBATCHCREATE=%HOME%\.emulationstation\batch\createscummvmbatchfiles.bat

REM for /f "tokens=*" %%S in ('dir /B "%SCUMMVMGAMESDIR%"') do del "%SCUMMVMBATCHDIR%\%%S.bat"
for /f "tokens=*" %%S in ('dir /B /A:D "%SCUMMVMGAMESDIR%"') do (
 set game=%%S
 set gameid=none
 for /f "tokens=*" %%G in ('"%SCUMMBATCHCREATE%" !game!') do set gameid=%%G

if not "!gameid!"=="none" (

echo "%%S" with ScummVM game id !gameid! found
 echo create "%SCUMMVMBATCHDIR%\%%S.bat" to start
 echo.
 echo %SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid! > "%SCUMMVMBATCHDIR%\%%S.bat"

)

)

 

Zur Vereinfachung hier das fertige Ergebnis – launch_portable.bat:

@echo off

set HOME=%~dp0
set HOME=%HOME:~0,-1%

:create_pc_gamelist_files
set PCGAMESDIR=%HOME%\.emulationstation\roms\pc
set PCGAMESBATCHDIR=%HOME%\.emulationstation\batch\pc

REM for /f "tokens=*" %%D in ('dir /B "%PCGAMESDIR%"') do del "%PCGAMESBATCHDIR%\%%D.game"
for /f "tokens=*" %%D in ('dir /B /A:D "%PCGAMESDIR%"') do (

echo "%%D" in pc game dir found 
 echo create "%PCGAMESBATCHDIR%\%%D.game" to start
 echo.
 echo. > "%PCGAMESBATCHDIR%\%%D.game"

)

:create_scummvm_game_bat
SETLOCAL ENABLEDELAYEDEXPANSION

set SCUMMVMGAMESDIR=%HOME%\.emulationstation\roms\scummvm
set SCUMMVMBATCHDIR=%HOME%\.emulationstation\batch\scummvm
set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe
set SCUMMBATCHCREATE=%HOME%\.emulationstation\batch\createscummvmbatchfiles.bat

REM for /f "tokens=*" %%S in ('dir /B "%SCUMMVMGAMESDIR%"') do del "%SCUMMVMBATCHDIR%\%%S.bat"
for /f "tokens=*" %%S in ('dir /B /A:D "%SCUMMVMGAMESDIR%"') do (
 set game=%%S
 set gameid=none
 for /f "tokens=*" %%G in ('"%SCUMMBATCHCREATE%" !game!') do set gameid=%%G

if not "!gameid!"=="none" (

echo "%%S" with ScummVM game id !gameid! found
 echo create "%SCUMMVMBATCHDIR%\%%S.bat" to start
 echo.
 echo %SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid! > "%SCUMMVMBATCHDIR%\%%S.bat"

)

)

cls

emulationstation.exe

 

Entsprechende Spieleordner von ScummVM Spielen speichern wir unter:

emulationstation\.emulationstation\roms\pc

 

Anschließend wird die es_systems.cfg für ScummVM angepasst zu:

<system>
    <name>scummvm</name>
    <fullname>ScummVM</fullname>
    <path>~\.emulationstation\batch\scummvm</path>
    <extension>.bat .BAT</extension>
    <command>"%ROM_RAW%"</command>
    <platform>pc</platform>
    <theme>scummvm</theme>
</system>

 

Bei meinem anschließenden Aufruf von launch_portable.bat wurden im Verzeichnis

emulationstation\.emulationstation\batch\scummvm

mehrere bat-Dateien erzeugt, deren Inhalt jeweils wie folgt (abhängig vom Spiel) ist:

G:\emulationstation\.emulationstation\systems\scummvm\scummvm.exe --savepath="G:\emulationstation\.emulationstation\roms\scummvm\Indiana Jones and the Fate of Atlantis Talkie" -f -p "G:\emulationstation\.emulationstation\roms\scummvm\Indiana Jones and the Fate of Atlantis Talkie" atlantis

In Emulation Station sehen wir anschließend:

emulatorstation_scummvm_list.jpg

Nach Aufruf von, zum Beispiel Monkey Island 2, wird ScummVM mit dem Spiel erfolgreich geöffnet. Beispiel (Menü-Aufruf über F5-Taste):

emulatorstation_scummvm_menu

 

Erläuterungen und Informationen zur der oben genannten Anpassung in der es_systems.cfg:

<system>
    <name>scummvm</name>
    <fullname>ScummVM</fullname>
    <path>~\.emulationstation\batch\scummvm</path>
    <extension>.bat .BAT</extension>
    <command>"%ROM_RAW%"</command>
    <platform>pc</platform>
    <theme>scummvm</theme>
</system>

Das Verzeichnis ~\.emulationstation\batch\scummvm und die extension .bat werden verwendet, um die Spiele in EmulationStation im Menü darzustellen. Bei Auswahl wird durch Verwendung „%ROM_RAW%“ die jeweilige bat-Datei im Verzeichnis ~\.emulationstation\batch\scummvm gestartet, die den gleichen Namen wie im Menü von Emulation Station hat.

 

Erläuterungen und Informationen zur Erweiterung der launch_portable.bat:

SETLOCAL ENABLEDELAYEDEXPANSION

set SCUMMVMGAMESDIR=%HOME%\.emulationstation\roms\scummvm
set SCUMMVMBATCHDIR=%HOME%\.emulationstation\batch\scummvm
set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe
set SCUMMBATCHCREATE=%HOME%\.emulationstation\batch\createscummvmbatchfiles.bat

REM for /f "tokens=*" %%S in ('dir /B "%SCUMMVMGAMESDIR%"') do del "%SCUMMVMBATCHDIR%\%%S.bat"
for /f "tokens=*" %%S in ('dir /B /A:D "%SCUMMVMGAMESDIR%"') do (
 set game=%%S
 set gameid=none
 for /f "tokens=*" %%G in ('"%SCUMMBATCHCREATE%" !game!') do set gameid=%%G

if not "!gameid!"=="none" (

echo "%%S" with ScummVM game id !gameid! found
 echo create "%SCUMMVMBATCHDIR%\%%S.bat" to start
 echo.
 echo %SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid! > "%SCUMMVMBATCHDIR%\%%S.bat"

)

)

 

Mit:

for /f "tokens=*" %%S in ('dir /B /A:D "%SCUMMVMGAMESDIR%"') do (
 set game=%%S
 set gameid=none
 for /f "tokens=*" %%G in ('"%SCUMMBATCHCREATE%" !game!') do set gameid=%%G

...

)

durchläuft das Skript alle Verzeichnisse unterhalb:

%HOME%\.emulationstation\roms\scummvm

und prüft den jeweiligen Namen über:

%SCUMMBATCHCREATE%" !game!

ob eine game id vorhanden ist. Das Ergebnis wird in gameid gespeichert. Anschließend wird durch:

if not "!gameid!"=="none" (

echo "%%S" with ScummVM game id !gameid! found
 echo create "%SCUMMVMBATCHDIR%\%%S.bat" to start
 echo.
 echo %SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid! > "%SCUMMVMBATCHDIR%\%%S.bat"

)

geprüft, ob gameid abweichend none ist. In diesem Fall wird eine bat-Datei gleich Ordnername vom Spieleverzeichnis im Batch-Verzeichnis gespeichert:

"%SCUMMVMBATCHDIR%\%%S.bat"

Der Inhalt ist hierbei:

%SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid!
  • %SCUMMVMEXE% entspricht dem Aufruf innerhalb der Batch-Datei der scummvm.exe-Datei
  • –savepath=“%SCUMMVMGAMESDIR%\%%S“ übergibt scummvm.exe die Info, dass die Spielstände im jeweiligen Spiel-Verzeichnis gespeichert werden sollen
  • -f legt Vollbild fest
  • -p „%SCUMMVMGAMESDIR%\%%S“ übergibt scummvm.exe den Pfad wo sich das Spiel befindet
  • !gameid! ist für scummvm.exe notwendig, damit die korrekte Datei zum Ausführen gestartet wird – in dieser Variante wird nirgends eine bat-, cmd- oder exe-Datei zum Start der Spiele übergeben.

 

Die Zeile:

REM for /f "tokens=*" %%S in ('dir /B "%SCUMMVMGAMESDIR%"') do del "%SCUMMVMBATCHDIR%\%%S.bat"

wird durch das am Anfang stehende REM nicht ausgeführt. Wer möchte, dass sein hinterlegtes Verzeichnis von .bat-Dateien immer bereinigt wird, damit gelöschte ScummVM-Spiele auch in EmulationStation nicht mehr zu sehen sind, kann auf eigene Gefahr das REM entfernen!!!

 

Erläuterungen und Informationen zur Erweiterung der createscummvmbatchfiles.bat:

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

set args=%*
set args=!args:"=!
set args=!args:  = !
set args=!args: Talkie=!
set gameid=none

set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe

for /f "tokens=*" %%S in ('"%SCUMMVMEXE%" -z ') do (
 set line=%%S
 set line=!line::=!
 set line=!line:/= !
 REM echo !line!

 set test=!line:%args%=!

 if NOT "!line!" == "!test!" ( 

 for /f "tokens=1*delims= " %%i in ("!line!") do (
 set gameid=%%i
 goto output
 )

 )

 )

:output
echo !gameid!

Durch:

set args=%*
set args=!args:"=!
set args=!args:  = !
set args=!args: Talkie=!

wird der Text zum zunächst übergebene Verzeichnis bereinigt, damit keine Anführungszeichen, doppelte Leerzeichen und ein ungewünschtes Wort “ Talkie“ nicht zum Vergleich verwendet werden. Bei Bedarf unterhalb:

set args=!args: Talkie=!

eine weitere Zeile wie:

set args=!args: lösche mich=!

einfügen.

Mit:

set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe

for /f "tokens=*" %%S in ('"%SCUMMVMEXE%" -z ') do (
 set line=%%S
 set line=!line::=!
 set line=!line:/= !
...
)

werden alle Zeilen der Ausgabe von scummvm.exe -z durchlaufen und Doppelzeichen gelöscht und Schrägstrich mit Leerzeichen ersetzt:

  • Broken Sword II: The Smoking Mirror (PlayStation/Demo) wird zu Broken Sword II The Smoking Mirror (PlayStation Demo)

Danach wird mittels:

set test=!line:%args%=!

 if NOT "!line!" == "!test!"

geprüft, ob der übergebene Name in der jeweiligen Ausgabe von scummvm.exe -z enthalten ist. In diesem Fall wird die Zeile der Ausgabe von Scummvm.exe um den Teilstring gekürzt und in test zwischengespeichert. Durch die Kürzung ist der anschließenden Vergleich nicht mehr identisch zur Ausgabe von scummvm.exe -z der Zeile.

Anschließend wird durch:

for /f "tokens=1*delims= " %%i in ("!line!") do (
 set gameid=%%i
 goto output
 )
...

:output
echo !gameid!

der Teil bis zum ersten Leerzeichen der aktuellen Zeile zwischengespeichert. Die Schleife wird unterbrochen und es wird nur die erste gefundene game id ausgegeben. Durch diese Abfolge wird bei Übergabe von:

  • Monkey Island – monkey ausgegeben
  • Monkey Island 2 – monkey2 ausgegeben

da die Ausgabe der Reihenfolge:

  • The Secret of Monkey Island
  • Monkey Island 2: LeChuck’s Revenge

entspricht.

 

Quelle für Spiele / Demos und Rechtliches:

Wer auf der Suche nach alten Klassikern ist, der muss beachten, dass die Spiele, auch wenn sie teilweise über 20 Jahre schon alt sind, nicht unbedingt frei und kostenlos verfügbar sind.

Schaut euch hierzu zum Beispiel:

an.

Teilweise ist es auch jetzt noch möglich alte Spieleklassiker zu kaufen. Zum Beispiel über http://www.gog.com (https://www.gog.com/game/kings_quest_4_5_6) oder, wenn auch sehr selten, als Humble Bundle. Teilweise haben Spielehersteller einige der alten Spiele frei zum Download freigegeben.

Ich persönlich bin froh, dass ich meine DOS-Lieblinge über die Jahre gut eingelagert habe. Die gute Spiele-Zeit war jedoch bei mir KC85/3 und C64 mit Boulderdash, Oil Imperium, Prince of Persia und Turrican. Das war vor 27 Jahren.

Erstelle eine kostenlose Website oder Blog – auf WordPress.com.

Nach oben ↑