Uso de línea de comandos, localizar archivo, escribir en un fichero (txt), etc

Buenas a todos, he pillado la costumbre de hacerme instaladores de todo lo que uso alguna vez, por ejemplo, de algún software que requiero arrancar con un emulador de MS-DOS, o algún juego de MS-Dos para que se me instale todo lo necesario y crear un "lanzador" para el juego con su acceso directo en el escritorio, o cuando emulo algún juego, lo mismo, crear un instalador que instale el emulador ya configurado, con su juego, sus opciones gráficas, el mando/teclado ya configurado, bios necesrias, etc.

El problema me lo he encontrado ahora al emular 3DO, con el emulador 4DO.

El fichero de configuración del 4DO no "acepta" rutas relativas, y por tanto, no encuentra la bios necesaria para arrancar si instalo el juego en un sitio diferente de donde lo dejé configurado.

Cargar directamente la rom, no hay problema, porque las opciones de línea de comandos del propio emulador tiene opciones para cargar el juego en cuestión directamente, siempre y cuando el juego esté en el mismo directorio del emulador, para arrancarlo tengo un .bat con lo siguiente:

4DO.exe --StartFullScreen -StartLoadFile nombre_del_fichero_del_juego


Pues bien, para solventar el problema de que "instale el juego/emulador en otro directorio" y que no funcione el emulador por no encontrar la bios, se me ocurre crear un .bat que se lance automáticamente tras la instalación y que haga lo siguiente:

- Localice el fichero de configuración, creo que necesito el comando FORFILES, pero tengo un par de problemas, el primero y más impostante, es que tengo que indicarle la unidad donde buscar el fichero, por ejemplo c:\ o d:\ ... y yo quiero que busque en "TODO EL EQUIPO", ya que no sé donde cojones lo voy a instalar en un futuro

El comando sería algo como esto

FORFILES /P C:\ /S /M “FourDO.settings” /C “cmd /c echo @path (realiza la búsqueda en C:)
ó
FORFILES /P D:\ /S /M “FourDO.settings” /C “cmd /c echo @path (realiza la búsqueda en D:)


Y que, en el fichero "FourDO.settings" cambie la línea <BiosRomFile>, por:
<BiosRomFile>D:\ruta_del_juego+emulador\Bios\nombre_de_la_bios.rom</BiosRomFile>


Otro problema, es que si tengo varias instalaciones (por ejemplo, cada una con la ROM de un juego diferente), me va a encontrar todas y no sólo la que me interesa


Cómo lo solventaríais?
No se como programarlo en powershell (en bash sería otra cosa), pero lo haría así:

Buscar archivo en C
               ¿existe? SI: usalo
                              NO: busca en D:


Para lo segundo, buscaría si existe, en la misma carpeta, el nombre del juego o si está contenido el nombre en la ruta de acceso: si instalas "mario" buscas el FourDO.settings que esté en la misma carpeta que el "mario.rom" o que tenga la secuencia "mario" en la ruta, según organices tu colección.

Para hacerlo junto, cada vez que encuentras un FourDO.settings tendras que comprobar que es el que quieres, y si no pasar al siguiente.
Otra opción es crearte un archivo temporal con todos los archivos FourDO.settings y luego ir probando con cada uno hasta encontrar en que necesitas.

Espero haberme explicado bien.
Joder, si es que soy idiota

La solución fácil es meter el .bat dentro del directorio del juego (durante la instalación) y hacer todo desde ahí.

La ruta donde se ejecuta el bat, sea cual sea esta, sería: %~d0%~p0

Para meterme en el directorio Settings (dentro del directorio del juego), donde está el FourDO.settings sólo tendría que incluir en el .bat:

cd %~d0%~p0Settings

sería como hacer, por ejemplo, suponiendo que esa fuera la ruta:
cd c:\Juegos\4DO\Settings

Sobre lo que dices @Esog Enaug, si, lo pillo, lo malo es que sigo teniéndole que indicar a mano "la unidad", y la máquina donde la vaya instalar puede tener sabe dios cuantas unidades, por ejemplo la máquina en la que estoy ahora (el sobremesa), tiene 3 unidades de disco HDD con un par de particiones cada una, más el SSD.

Lo más fácil sería lo de arriba, %~d0%~p0 te da la ruta desde donde estás ejecutando el fichero batch (.bat)

Por tanto la ruta de la bios con el nombre de la bios sería algo como:

<BiosRomFile>%~d0%~p0Bios\3do_bios_fz10.rom</BiosRomFile>

Donde %~d0%~p0Bios\ equivaldría para el .bat a algo como C:\Juegos\4DO_Emulador\Super Street Fighter II Turbo\Bios\3do_bios_fz10.rom (suponiendo que voy a emular el mencionado Super Street Fighter II Turbo de 3DO)

Y donde 3do_bios_fz10.rom es el nombre de la bios



Ahora me he encontrado con otro problema, el fichero en cuestión tiene el siguiente contenido con la configuración del emulador:

<?xml version="1.0" encoding="utf-8"?>
<Settings>
<GameRomLastDirectory></GameRomLastDirectory>
<AudioVolume>1</AudioVolume>
<WindowImageSmoothing>True</WindowImageSmoothing>
<AudioBufferMilliseconds>100</AudioBufferMilliseconds>
<GameRomSourceType>0</GameRomSourceType>
<AutoLoadLastSave>True</AutoLoadLastSave>
<VoidAreaBorder>False</VoidAreaBorder>
<WindowScalingAlgorithm>1</WindowScalingAlgorithm>
<VoidAreaPattern>0</VoidAreaPattern>
<LastPauseStatus>False</LastPauseStatus>
<InactiveIgnoreKeyboard>True</InactiveIgnoreKeyboard>
<GameRomDrive>
</GameRomDrive>
<WindowSnapSize>True</WindowSnapSize>
<WindowWidth>656</WindowWidth>
<SelectedOptionTab>0</SelectedOptionTab>
<WindowPreseveRatio>True</WindowPreseveRatio>
<AutoOpenGameFile>False</AutoOpenGameFile>
<GameRomFile>SuperStreetFighterIITurbo.iso</GameRomFile>
<SaveStateSlot>0</SaveStateSlot>
<WindowFullScreenDevice>0</WindowFullScreenDevice>
<BiosRomFile></BiosRomFile>
<WindowAutoCrop>False</WindowAutoCrop>
<RenderHighResolution>False</RenderHighResolution>
<WindowScale>False</WindowScale>
<CpuClockHertz>12500000</CpuClockHertz>
<BiosRom2File>
</BiosRom2File>
<WindowHeight>565</WindowHeight>
<Language>
</Language>
<WindowFullScreen>True</WindowFullScreen>
<InactivePauseEmulation>True</InactivePauseEmulation>
</Settings>



Lo que me interesa cambiar es <BiosRomFile></BiosRomFile>, la ruta va en el medio de esas 2 etiquetas, algo así:

<BiosRomFile>ruta_de_la_Bios</BiosRomFile>

Para poder encontrar el lugar donde insertar la cadena, lo que se me ocurre es editar el fichero de texto y colocar en esa línea

<BiosRomFile>RutaBIOS</BiosRomFile>

Así puedo buscar el string RutaBIOS y sustituirlo por la ruta del juego, con algo como:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('type FourDO.settings') do (
set linea=%%x
set linea=!linea:RutaBIOS=%~d0%~p0Bios\3do_bios_fz10.rom!
call :show !linea!
)
goto:eof
:show
echo %* >> out.txt
goto:eof



O más fácil, eliminar las líneas <BiosRomFile></BiosRomFile> y </Settings>

Y simplemente usar:

@echo off

cd %~d0%~p0Settings

echo <BiosRomFile>%~d0%~p0Bios\3do_bios_fz10.rom</BiosRomFile> >> FourDO.settings
echo </Settings> >> FourDO.settings


Así se añaden esas dos líneas (previamente borradas) al final del fichero quedando perfecto, en teoría

El problema es que el intérprete de comandos de Windows (y el de MS-Dos supongo que haría o mismo), no escribe strings que contengan caracteres especiales como <, > ó \


Se solventa usando comillas ("), pero... entonces surje otro problema, y es que las comillas se añaden también al fichero .bat con cualquiera de las 2 formas de editar el fichero.

@echo off

cd %~d0%~p0Settings

echo "<BiosRomFile>%~d0%~p0Bios\3do_bios_fz10.rom</BiosRomFile>" >> FourDO.settings
echo "</Settings>" >> FourDO.settings



Y quedaría al final algo como esto:

<CpuClockHertz>12500000</CpuClockHertz>
<BiosRom2File>
</BiosRom2File>
<WindowHeight>565</WindowHeight>
<Language>
</Language>
<WindowFullScreen>True</WindowFullScreen>
<InactivePauseEmulation>True</InactivePauseEmulation>
" <BiosRomFile>C:\Juegos\4DO_Emulador\Super Street Fighter II Turbo\Bios\3do_bios_fz10.rom</BiosRomFile>"
" </Settings>"




¿Alguien sabe como hacer lo mismo sin que se añadan las comillas? ¿o como borrarlas después? porque así el emulador no reconoce la configuración.


Gracias.
Prueba con "", ' y ''.
Tambien tienes este enfoque: https://technet.microsoft.com/es-es/library/jj643255.aspx

Y para borrar caracteres: https://www.enmimaquinafunciona.com/pregunta/10997/powershell-2-como-quitar-un-caracter-especifico-de-un-cuerpo-de-texto-ascii

PD1 Te lo habia elaborado mejor, pero se me ha borrado y me da pereza repetirlo, lo siento. De todas formas tienes toda la info. En tu caso creo que te sería mas facil la opción de borrar las comillas.

PD2 En la consola (bash) de linux es mucho mas facil y me da la impresion que mucho mejor documentado
Esog Enaug escribió:Prueba con "", ' y ''.
Tambien tienes este enfoque: https://technet.microsoft.com/es-es/library/jj643255.aspx

Y para borrar caracteres: https://www.enmimaquinafunciona.com/pregunta/10997/powershell-2-como-quitar-un-caracter-especifico-de-un-cuerpo-de-texto-ascii

PD1 Te lo habia elaborado mejor, pero se me ha borrado y me da pereza repetirlo, lo siento. De todas formas tienes toda la info. En tu caso creo que te sería mas facil la opción de borrar las comillas.

PD2 En la consola (bash) de linux es mucho mas facil y me da la impresion que mucho mejor documentado



No lo dudes, las pocas cosas que he hecho en GNU/Linux en su momento, me ha resultado supersencillo, porque aunque no sepa hacer algo, abunda información por todas partes, además, el bash es mucho más, no sé como decirlo, "flexible", "dinámico", "adaptable", el línea de comandos de MS-DOS y Windows, es "sota, caballo, rey", puede hacer X o Y y poco más, y luego dar vueltas y vueltas con las 4 cosas que tienes para hacer lo que quieres.

La información que se encuentra por internet y la documentación es repetitiva, y siempre son los "mismos casos", muy básicos, para hacer algo más "enrevesado" (que tampoco lo es tanto) es complicado encontrar info, encuentras algo y te quedas con cara de "ya, ya, eso ya lo sé, pero y si quiero hacer 'tal' o 'cual', cómo lo resuelvo?", cara de póker, vamos.

Hacer scripts en GNU/Linux me resulta/resultaba muchísimo más intuititvo, pero claro, para juegos, aunque la emulación está muy bien en GNU/Linux (DosBOX, ScummVM, emuladores de consola, etc), y juegos modernos empiezan a salir bastante, lo gordo del mercado sigue estando en Windows. Tenía el principal antiguamente con 4 particiones, una para Windows, que casi sólo usaba para jugar, un Debian, un Ubuntu y una partición expresamente para "probar distros"... ahora sólo tengo una partición en el SSD con Windows y ya...



En este caso he tenido "suerte", resulta que al fichero de configuración de 4DO "le suda la po**a" que el fichero tenga comillas, así que simplemenente añadiendo el String (bueno, ese y el cierre de la </Settings >), funciona.

Lo de las comillas quiero saberlo de todas formas, si alguien tiene una idea, porque no es la primera vez que me pasa, ya me pasó cuando quise hacer un parche de traducción para el Desperados 2 de PC (versión GOG), que lo tengo tanto en mi cuenta de GOG como en versión DVD... y también tuve que hacer un "apaño cutre"
@SGAN prueba a usar el simbolo ^ en lugar de las comillas a ver. A mi me ha solucionado algun tema con caracteres en scripts.

slaudos
tognin escribió:@SGAN prueba a usar el simbolo ^ en lugar de las comillas a ver. A mi me ha solucionado algun tema con caracteres en scripts.

slaudos



Lo tendré en cuenta @tognin, y un día de estos probaré, o cuando haga el instalador para el siguiente juego de 3DO que me interesa, el Lucienne's Quest, que lo hay para Saturn (se llama Sword & Sorcery), y está mucho mejor, mejores gráficos, etc, pero sólo en japo y no hay traducciones.

Como el emulador de 3DO "traga" con las comillas en el fichero de configuración, ese juego ya lo dejé como quedó y me puse con el Street Fighter Alpha 3 que tengo de mi PSX... otro "por culo" por cierto, pero este porque la configuración del ePSXe se guarda en el registro de windows de forma "genérica" (para cualquier jugego que lance)... así que hay que generar ficheros .reg que modifiquen el registro y lanzadores .bat o .exe que lancen esos ficheros para actualizar el registro al lanzar cada juego.

Al final tuve que meter "no sé cuantos" ficheros .reg y no se cuantos "batch files" para exportar e importar configuraciones al registro, para copiar / hacer resguardos de los ficheros y lanzar el juego, según como quiera lanzarlo... para configurar el vídeo, el audio, y los mandos... si no se hace así, en cuanto configures el ePSXe para otro juego, las configuraciones que guardaras para el primero, "se machacan".


También encontré un programita en SourceForge, que creo que me va a dar la vida, se llama FART ( pedo :D ), "Find And Replace Text", con licencia GPLv2... busca una cadena en un fichero de texto y la reemplaza con otra, de una forma muy sencilla y cómoda.


Por si a alguien le viene bien para hacer cosillas, lo dejo aquí:

http://fart-it.sourceforge.net

https://sourceforge.net/projects/fart-it/
6 respuestas