¿ Como añadir una variable (si / no) en un archivo por lotes ?

Quisiera añadir al principio de este archivo por lotes la opción (variable si / no) para avanzar o cerrar el

Script.

Este comando script lista todos los archivos de música con extensión .mp3 en el directorio actual y sus subdirectorios.
Cuenta la cantidad de archivos encontrados y genera un archivo de texto llamado "MIS MP3s.txt" que muestra la lista de archivos y la cantidad total.
Luego, muestra un mensaje emergente con la cantidad de archivos mp3 encontrados y espera 3 segundos antes de abrir el archivo de texto con la lista.
Finalmente, cierra automáticamente el Bloc de notas y finaliza el script.

@echo off
echo  +----------------------+
echo  ^|  Lista de Archivos 
echo  +----------------------+
setlocal enabledelayedexpansion
set contador=1
(for /R %%X in (*.mp3) do (
    echo  ^|  !contador!. %%~nX%%~xX
    set /a contador+=1
)) > "MIS MP3s.txt"
echo  +----------------------+
set canciones=0
for /R %%A in (*.mp3) do set /a canciones += 1
if %canciones% equ 0 (
    echo  ^|  No se ha encontrado ningún archivo MP3
    echo  ^|  No se ha encontrado ningún archivo MP3 >> "MIS MP3s.txt"
) else (
    echo  ^|  %canciones% archivos mp3
    echo  ^****** TXUS Se han encontrado %canciones% archivos MP3 ********* >> "MIS MP3s.txt"
)
echo  +----------------------+
echo Set objShell = CreateObject("WScript.Shell") > "%temp%\_vbs.vbs"
if %canciones% equ 0 (
    Echo objShell.Popup "No se ha encontrado ningún archivo MP3", 3, "Cantidad MP3 en esta carpeta" >> "%temp%\_vbs.vbs"
) else (
    echo objShell.Popup "HAY [ %canciones% ] MP3", 3, "Cantidad MP3 en esta carpeta" >> "%temp%\_vbs.vbs"
)
%__AppDir__%cscript.exe "%temp%\_vbs.vbs" //nologo 
timeout /t 3 >nul
start "" "MIS MP3s.txt"
timeout /t 3 /nobreak > nul
taskkill /f /im notepad.exe
exit

Cualquier ayuda me seria muy útil.

1 respuesta

Respuesta
2

Me resulta curioso que preguntes algo que me parece bastante sencillo para incluirlo en un script muy bien elaborado. Pero supongo que a veces ocurren esas cosas, aunque también podría ocurrir que no te haya entendido bien y que la consulta tenga más enjundia.

Si te he entendido bien basta con que sitúes al principio del script (o bien después de la primera instrucción) lo siguiente:

set /p lLanzar=¨Se quiere lanzar el script (S/N)? 
if not %lLanzar%==S if not %lLanzar%==s goto :eof

Prueba y me dices. Asegúrate que la primera instrucción lleve un espacio al final (algunos editores eliminan los espacios al final de una línea). No es fundamental para que funcione pero queda un poco más "elegante" porque separa la respuesta de la pregunta.

Gracias por responder maestro.

Efectivamente como bien decías la solución que apuntas es sencilla y la tuve en cuenta. Al colocar el comando que mandaste al principio del  script funciona bien y la pregunta la declara dentro de la consola cmd como lo muestra esta captura: 

Pero mi objetivo que la pregunta aparezca en una ventana emergente como esta:

 Después de mucho intentarlo, me quede estancado.

Consciente de algún tipo de fallo de planteamiento, no puedo avanzar.

Gracias maestro por tu tiempo, y me alegra volver a conectar contigo.

Entiendo que lo que quieres supondría invocar a VB desde el inicio del BAT para presentar una especie de MsgBox. El problema que no sé resolver es el paso del "resultado" de la MsgBox a una variable del BAT de partida.

Si tienes algo desarrollado en ese sentido puedes ponerlo por aquí. Por mi parte intentaré estudiar un poco el asunto en mis pocos ratos libres. De momento he echado un vistazo a esta página

https://stackoverflow.com/questions/9074476/is-it-possible-to-embed-and-execute-vbscript-within-a-batch-file-without-using-a 

Estoy desconcertado, ya que trato de enviarte el script que estoy desarrollando y por razones que desconozco la pagina no me deja enviarlo, .

Por lo tanto, aun no siendo la forma apropiada de hacerlo te lo envió en forma de imagen por si detectas el fallo. 

Con este script consigo que se muestre el cuadro de dialogo, pero

lo que obtengo al presionar si, es que entra en un bucle infinito volviendo a aparecer el cuadro de mensaje MSGBOX.

He intentado recuperar el texto del pantallazo. Voy a intentar poner algo de él a ver si me da problemas o no:

@echo off

Sigo aumentando el texto:

@echo off
echo Set objShell = CreateObject("WScript.Shell”) > "%temp%\_vbs_create.vbs"

Más texto:

@echo off
echo Set objShell = CreateObject("WScript.Shell”) > "%temp%\_vbs_create.vbs"
echo respuesta = MsgBox("¿Desea crear el archivo MIS MP3s.txt?", vbYesNo, "Crear archivo”) » "%temp%\_vbs_create.vbs" 

No sé que línea provoca el error

Creo que he reconstruido el bat del pantallazo aunque parece obvio que falta algo del final porque no creo que la última línea sea:

%__AppDir___%cscript.exe "%temp%\_v

sino, más bien:

%__AppDir___%cscript.exe "%temp%\_vbs_no_create.vbs" 

Pero no tengo garantías de que no falte alguna línea más.

Con lo que he visto, y lo que imagino que puede hacer el VB, creo que el bucle se produce porque el Run del VB ejecuta el propio bat desde el que se lanza, con el parámetro "create".

Lo suyo sería poder pasar a una variable del BAT la variable "respuesta" del VB pero no se me ocurre como se podría hacer eso.

Gracias por responder Maestro.

Lo primero agradecerte el link que me dejaste de (stackoverflow), ya que me abrió los ojos, y me di cuenta que lo que quiero conlleva mas complicación de lo que parece. Como suelo decir "mucha pieza para poca caña". Decidí cambiar de estrategia al darme cuenta que en vez de  invocar a VB en un archivo por lotes,  seria mas fácil hacerlo con "powershell" dentro del lote. Efectivamente, conseguí lo deseado con el mínimo esfuerzo.

Si te preguntabas el propósito por lo que quiero que se muestre la ventana de dialogo emergente fuera de la consola, la respuesta es que, el script lo convertiré en formato .exe. Si la ventana estuviese en la misma consola, al ejecutar el .exe, no seria visible, y por tanto no podría interactuar. 

Te envió el código completo

y de nuevo mil gracias por todo.

@echo off
for /f "delims=" %%a in ('powershell -Command "& {[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null; [Microsoft.VisualBasic.Interaction]::MsgBox('¿Desea crear el archivo MIS MP3s.txt?', 'YesNo,Question', 'Crear archivo')} "') do set "respuesta=%%a"
if "%respuesta%"=="Sí" (
    rem Agregamos una variable para indicar si el script ya se ha ejecutado con el parámetro create
    set executed=1
    call "%~f0" create
) else if "%respuesta%"=="No" (
    rem Agregar aquí lo que quieres que suceda cuando se presiona "No"
    exit
) else if "%respuesta%"=="Cancel" (
    rem Cerrar el script cuando se presiona "Cancelar"
    exit
) 
echo  +----------------------+
echo  ^|  Lista de Archivos 
echo  +----------------------+
setlocal enabledelayedexpansion
set contador=1
(for /R %%X in (*.mp3) do (
    echo  ^!contador!º - %%~nX%%~xX
    set /a contador+=1
)) > "MIS MP3s.txt"
echo  +_______________________________________________+
echo  +-----------------------------------------------+
set canciones=0
for /R %%A in (*.mp3) do set /a canciones += 1
if %canciones% equ 0 (
    echo  ^|  No se ha encontrado ningún archivo MP3
    echo  ^|  No se ha encontrado ningún archivo MP3 >> "MIS MP3s.txt"
) else (
    echo  ^| ENCONTRADOS [ %canciones% ] ARCHIVOS mp3
    echo  ^*>> "MIS MP3s.txt"
    echo  ^*>> "MIS MP3s.txt"
    echo  ^*>> "MIS MP3s.txt"
    echo  ^****** TXUS Se han encontrado  { %canciones% }  archivos MP3 ********* >> "MIS MP3s.txt"
)
echo  +_______________________________________________+
echo  +-----------------------------------------------+
echo Set objShell = CreateObject("WScript.Shell") > "%temp%\_vbs.vbs"
if %canciones% equ 0 (
    echo objShell.Popup "No se ha encontrado ningún archivo MP3", 3, "Cantidad MP3 en esta carpeta" >> "%temp%\_vbs.vbs"
) else (
    echo objShell.Popup "HAY [ %canciones% ] MP3", 3, "Cantidad MP3 en esta carpeta" >> "%temp%\_vbs.vbs"
)
%__AppDir__%cscript.exe "%temp%\_vbs.vbs" //nologo 
timeout /t 2 >nul
start "" "MIS MP3s.txt"
timeout /t 3 /nobreak > nul
taskkill /f /im notepad.exe
exit

Me alegra mucho, mucho, que el enlace a stackoverflow te haya servido. De hecho esa web es para mí "palabra de Dios". Representa todas las virtudes de internet y a unos niveles casi inimaginables. Alguna vez he preguntado y siempre he obtenido respuesta y casi siempre solución.

Y el powershell (PS) es otra de mis tareas pendientes. Me asusta lo de que sea "orientado a objetos" que es algo que he intentado entender unas cuantas veces pero con poco éxito. Lo utilizo a veces cuando las limitaciones de la "programación batch" me impiden resolver alguna cosilla y siempre consigo resolverla, pero me cuesta bastante asimilarlo y, sobre todo, lo que hago es más bien un traslado a lenguaje PS del intento fallido en BAT. Sé que de esta forma no utilizo todo el enorme potencial de esa shell pero me sirve para salir del paso.

Y gracias por lo que me pasas. Seguro que me da pistas y/o soluciones para los problemillas en los que me meto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas