Bat para todas las iniciales de cada palabra en mayúscula

Se puede hacer un Bat para cada cambiar todas las iniciales de cada palabra en mayúsculas y que se pueda ejecutar desde cualquier carpeta.

Es decir si tengo un doc o txt con titulo

Agua marzo

Que quedara así

Agua Marzo

1 Respuesta

Respuesta
4

No me queda muy claro si quieres aplicar esos cambios a nombres de archivos o al contenido de los archivos, pero parece que se trata de lo primero.

@echo off
Setlocal EnableDelayedExpansion
set carpeta=d:\carpeta prueba
cd %carpeta%
for /f "tokens=*" %%a in ('dir /b *.txt') do call :renombrar %%a
del /q kkk.txt>nul 2>&1
goto :eof
:renombrar
del /q kkk.txt>nul 2>&1
set nomant=
set nomnue=
:bucle
if "%1"=="" (
   Copy "%nomant%" kkk.txt>nul
 del /q "%nomant%">nul 2>&1
 copy kkk.txt "%nomnue%">nul
 goto :eof
   )
set palabra=%1
set Inicial=%palabra:~0,1%
set Resto=%palabra:~1%
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set Inicial=!Inicial:%%x=%%x!
if "%nomant%"=="" (set nomant=%1&set nomnue=%Inicial%%Resto%
   ) else set nomant=%nomant% %1&set nomnue=%nomnue% %Inicial%%Resto%
shift
goto :bucle

Espero que el editor de la página no haga de las suyas introduciendo espacios después del carácter !

Gracias por la respuesta

No es exactamente lo que me gustaría que hiciera.
Yo utilizo los BAT con el shell del botón derecho, lo que me gustaría es que al seleccionar los archivos de cualquier carpeta, cualquier archivo txt, mp3, avi etc, si por ejemplo la primara letra de cada palabra esta en minúscula la convierta a mayúscula.
Ejemplo:
03 - when smokey sings (7'' version)
quedaria asi
03 - When Smokey Sings (7'' Version).

Ya se que existen software para realizar esa función tipo aren, flexible renamer etc. pero seria más rápido seleccionando archivos y ejecutar el bat con botón derecho.

Si es muy complicado no hace falta que pierdas el tiempo.

Muchas gracias por tu tiempo.

Saludos

Aclárame un poco lo que dices de "Yo utilizo los BAT con el shell del botón derecho". Imagino que estás hablando del Explorador de Windows, marcas un archivo y pulsas el botón derecho del ratón. Lo que no entiendo es cómo le aplicas un BAT determinado, ¿con la opción "Abrir con"?

No utilizo la opción abrir con

En el registro creo una clave

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\Delante]
@="Delante"
"icon"="\"icon\"=\"D:\\01 - programas directos\\01 - Scripts, Bats, Configs, Macros\\Bats Buenos\\Cambiar De Nombre Delante\\delante.ico\""
[HKEY_CLASSES_ROOT\*\shell\Delante\command]
@="\"D:\\01 - Programas Directos\\01 - Scripts, Bats, Configs, Macros\\Bats Buenos\\Bats CMenuEdit\\Delante.bat\" \"%1\""

y el bat utilizado seria

@echo off
Ren %1 = Delante.jpg

Me parece muy interesante lo que me comentas.

Si lo he entendido bien podrías probar con esta versión del primer bat:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=%~d1%~p1
call :renombrar %~n1%~x1
goto :eof
:renombrar
echo %*
pause
del /q "%carpeta%kkk.txt">nul 2>&1
set nomant=
set nomnue=
:bucle
if "%1"=="" (
   Copy "%carpeta%%nomant%" "%carpeta%kkk.txt">nul
 del /q "%carpeta%%nomant%">nul 2>&1
 copy "%carpeta%kkk.txt" "%carpeta%%nomnue%">nul
 del /q "%carpeta%kkk.txt">nul 2>&1
 goto :eof
   )
set palabra=%1
set Inicial=%palabra:~0,1%
set Resto=%palabra:~1%
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set Inicial=!Inicial:%%x=%%x!
if "%nomant%"=="" (set nomant=%1&set nomnue=%Inicial%%Resto%
   ) else set nomant=%nomant% %1&set nomnue=%nomnue% %Inicial%%Resto%
shift
goto :bucle

Entiendo que el icono y el nombre asignado a este bat tendrías que incluirlos en el registro, de forma similar al ejemplo que me has puesto. Si de entrada no funciona habría que depurarlo un poco. Para ello habría que incluir algún PAUSE y algún ECHO en los puntos  más significativos. Yo lo he probado con "Abrir con" y me funciona correctamente.

Se me han colado, precisamente, dos comandos de depuración:

ECHO %*

PAUSE

Puedes dejarlos de momento y quitarlos luego, si funciona correctamente.

Hola solo funciona si se selecciona un archivo, si seleccionas varios no funciona.Solo modifica un archivo.

Desde el registro no funciona.

Saludos y perdona por las molestias.

En el primer caso, ¿cómo lo haces? ¿Con "Abrir con"? ¿Te permite esa opción para varios archivos?

Desde el registro, ¿se activa el BAT? Si mantienes los comandos de depuración, ¿se abre una ventana de CMD?

Si entendí bien, la opción del registro es para un solo archivo o, al menos, solo uno cada vez (por eso aparece el %1 en el command, ¿no?).

En este caso lo he probado de la siguiente forma, he metido el bat en la carpeta de Windows\"SendTo", he seleccionado varios archivos botón derecho "enviar a" y solo cambia el nombre de un archivo.

Saludos.

botón derecho "enviar a"  picar sobre el BAT y solo cambia el nombre de un archivo.

Para esta utilización tal vez te pueda servir esta nueva versión:

@echo off
Setlocal EnableDelayedExpansion
:Bucle1
if "%~1"=="" goto :eof
set carpeta=%~d1%~p1
call :renombrar %~n1%~x1
shift
goto :bucle1
:renombrar
del /q "%carpeta%kkk.txt">nul 2>&1
set nomant=
set nomnue=
:bucle2
if "%1"=="" (
   Copy "%carpeta%%nomant%" "%carpeta%kkk.txt">nul
 del /q "%carpeta%%nomant%">nul 2>&1
 copy "%carpeta%kkk.txt" "%carpeta%%nomnue%">nul
 del /q "%carpeta%kkk.txt">nul 2>&1
 pause
 goto :eof
   )
set palabra=%1
set Inicial=%palabra:~0,1%
set Resto=%palabra:~1%
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set Inicial=!Inicial:%%x=%%x!
if "%nomant%"=="" (set nomant=%1&set nomnue=%Inicial%%Resto%
   ) else set nomant=%nomant% %1&set nomnue=%nomnue% %Inicial%%Resto%
shift
goto :bucle2

Pero me gustaría que me contestaras también a lo que te preguntaba sobre la opción "registro"

También esta vez se me quedó un PAUSE de depuración. Puedes eliminarlo

Hola Gracias por todo.

Funciona bien pero solo me deja utilizarlo botón derecho "enviar a" . Ahora selecciono archivos y enviar a y cambia iniciales a mayúsculas.

Respecto a lo del registro es el nivel de carpeta si no lo pusiera no lo ejecutaría lo copie de un programa llamado Unlocker

Delante.bat\" \"%1\""

"D:\01 - Programas Directos\01 - Tools\Unlocker 1.9.0\Unlocker.exe" "%1"

Me he encontrado con el problema que al seleccionar archivos las palabras en mayúsculas las deja solo cambia las que están en minúsculas

EPIC RUMORS - 01 - At The Edge Of Heaven

Ha cambiado at the edge of heaven por At The Edge Of Heaven.

pero EPIC RUMORS que ya estaban en mayusculas las ha dejado tal cual.

Saludos.

Sigo sin entender que ocurre con los intentos a nivel de registro. Independientemente de la "inspiración" para este uso, me gustaría saber como la estás intentando realizar en este caso. Digamos que guardas el BAT como CambInic.bat y que incluyes su icono y su comando en el HKCR del registro. ¿Es así? A partir de ahí en el desplegable del botón derecho te sale una nueva opción para esta función que se aplica a ¿archivos? ¿Carpetas? Si la aplicas, ¿qué ocurre? ¿Sale alguna ventana CMD? ¿Algún error?

Respecto a lo que dices de EPIC RUMORS está claro. Las "especificaciones" hablaban de poner en mayúsculas la primera letra de cada palabra. No decían nada de que hubiera que poner en minúsculas las demás. Y, de momento, esto segundo no está contemplado. Pero podemos cambiar las "especificaciones" del BAT, aunque intuyo que será un poco más farragoso porque habría que tratar todas las letras de cada palabra, con un tratamiento diferenciado para la primera.

Hola Le he puesto de nombre capitalizar, cuando lo intento ejecutar por medio del registro igual que el otro Bat me sale este mensaje.

Respecto a lo otro si supone mucho trabajo olvidalo.

Saludos.

Creía que iba a ser más lioso, pero en realidad el cambio es muy sencillo. Esta sería la versión que se adapta a las nuevas "especificaciones":

@echo off
Setlocal EnableDelayedExpansion
:Bucle1
if "%~1"=="" goto :eof
set carpeta=%~d1%~p1
call :renombrar %~n1%~x1
shift
goto :bucle1
:renombrar
del /q "%carpeta%kkk.txt">nul 2>&1
set nomant=
set nomnue=
:bucle2
if "%1"=="" (
   Copy "%carpeta%%nomant%" "%carpeta%kkk.txt">nul
 del /q "%carpeta%%nomant%">nul 2>&1
 copy "%carpeta%kkk.txt" "%carpeta%%nomnue%">nul
 del /q "%carpeta%kkk.txt">nul 2>&1
 goto :eof
   )
set palabra=%1
set Inicial=%palabra:~0,1%
set Resto=%palabra:~1%
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set Inicial=!Inicial:%%x=%%x!
if not "%Resto%"=="" for %%x in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set Resto=!Resto:%%x=%%x!
if "%nomant%"=="" (set nomant=%1&set nomnue=%Inicial%%Resto%
   ) else set nomant=%nomant% %1&set nomnue=%nomnue% %Inicial%%Resto%
shift
goto :bucle2

Perdón, le di a "ENVIAR" antes de tiempo.

El BAT anterior (y las otras versiones) no funciona bien si el nombre incluye paréntesis. Estoy intentando averiguar la causa, pero todavía no lo he conseguido.
Respecto a la ejecución vía botón derecho intuyo que el problema está en lo que se haya anotado en el registro para la clave Capitalizar\Command. ¿Puedes ponerme por aquí las dos claves, icon y command y el contenido del path indicado en el Command? Es que si has movido el BAT a la carpeta SendTo, en lugar de usar un acceso directo, para hacer la otra prueba, podría ser esa la causa.

Creo que ya he resuelto el problema con los paréntesis. La solución es un poco paradójica, en el sentido de que, sobre el papel, no hay cambios reales pero la falta de transparencia de muchos comandos de msdos respecto a los caracteres "especiales" tiene estas cosas. No descarto que otros caracteres de estos, si están permitidos en los nombres, puedan dar problemas. Esta sería la última versión:

@echo off
Setlocal EnableDelayedExpansion
:Bucle1
if "%~1"=="" goto :eof
set carpeta=%~d1%~p1
call :renombrar %~n1%~x1
shift
goto :bucle1
:renombrar
del /q "%carpeta%kkk.txt">nul 2>&1
set nomant=
set nomnue=
:bucle2
if "%1"=="" (
   Copy "%carpeta%%nomant%" "%carpeta%kkk.txt">nul
 del /q "%carpeta%%nomant%">nul 2>&1
 copy "%carpeta%kkk.txt" "%carpeta%%nomnue%">nul
 del /q "%carpeta%kkk.txt">nul 2>&1
 goto :eof
   )
set palabra=%1
set Inicial=%palabra:~0,1%
set Resto=%palabra:~1%
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set Inicial=!Inicial:%%x=%%x!
if not "%Resto%"=="" for %%x in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set Resto=!Resto:%%x=%%x!
if not "%nomant%"=="" set nomant=%nomant% %1&set nomnue=%nomnue% %Inicial%%Resto%
if "%nomant%"=="" set nomant=%1&set nomnue=%Inicial%%Resto%
shift
goto :bucle2

Lo he probado y desde enviar a funciona perfecto.

Para hacer la prueba con el registro he creado una carpeta en C y lo he metido dentro la clave queda así.

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\Capitalizar]
@="Capitalizar"
"icon"="\"icon\"=\"D:\\01 - programas directos\\01 - Scripts, Bats, Configs, Macros\\Bats Buenos\\Cambiar De Nombre Delante\\delante.ico\""
[HKEY_CLASSES_ROOT\*\shell\Capitalizar\command]
@="\"C:\C\Capitalizar.bat\" \"%1\""

Muchas Gracias.

Saludos

El párrafo de icon da igual es para que se vea un icono pero no funciona.

"icon"="\"icon\"=\"D:\\01 - programas directos\\01 - Scripts, Bats, Configs, Macros\\Bats Buenos\\Cambiar De Nombre Delante\\delante.ico\""

No sé si el BAT está en el raíz de C: o en una carpeta llamada C dentro del disco C:. En todo caso creo que no está bien "redactada" la entrada del command.

En el primer caso creo que debería ser:
@="\"C:\\Capitalizar.bat\" \"%1\""
y en el segundo:

@="\"C:\\C\\Capitalizar.bat\" \"%1\""

El Bat se eencuentra dentro de una carpeta llamada C seria el segundo caso.

Funciona mediante botón derecho registro, bien pero si selecciono por ejemplo 8 archivos renombra todos pero al final elimina 1 archivos es decir quedan 7.

Si hago lo mismo botón derecho "enviar a" no elimina ninguno y renombra todos.

Saludos

Es cierto aunque no lo puedo entender. Al final he creado en mi entorno una opción de registro y veo que me borra uno de los archivos.

Te pongo aquí las capturas de pantalla. Le he llamado ChgName (perdón por la tendencia anglo). Esta es la pantalla antes de ejecutar la opción:

Y esta después de ejecutarla:

Efectivamente ha borrado la segunda que empieza por 02. Voy a ver si se me ocurre la causa. De paso he detectado que si en algún nombre hay más de un espacio no hace el cambio de nombre. Las cosillas de la "programación batch"

Muchas gracias por tu tiempo.

Saludos

Es muy raro. Sobre los mismos archivos, si cambio el orden, a veces se borran dos y otras uno. Si los tomo de tres en tres no se borran.

He llegado a la conclusión de que este borrado se produce por interferencia entre la ejecución de una instancia del renombrado con otra. Como el comando rename no funciona cuando el nuevo nombre se diferencia del anterior en mayúsculas o minúsculas, porque no distingue entre unas y otras, he tenido que recurrir a copiar el archivo con el nombre antiguo a un archivo temporal (KKK.TXT), borrar el antiguo, copiar el temporal con el nuevo nombre y borrar el temporal. Como el temporal es siempre el mismo al lanzar el bat de forma simultánea para varios archivos se crean varias instancias de ejecución que trabajan sobre el mismo KKK.TXT. Si éste se borra cuando se iba a copiar en el destino, que se ha borrado previamente, la copia no funciona. He modificado el BAT para que no use siempre el mismo archivo temporal, sino que el nombre del temporal se obtenga a partir del nombre antiguo. Así ya no parece haber borrados. Además he quitado el BUCLE1 porque en la "ejecución desde registro" (por llamarle de alguna manera) solo se trata un archivo cada vez, a diferencia de lo que ocurre con la "ejecución por enviar a" en la que se tratan todos los archivos de golpe. Esta sería la versión para la "ejecución desde registro":

@echo off
Setlocal EnableDelayedExpansion
set carpeta=%~d1%~p1
call :renombrar %~n1%~x1
:renombrar
set nomant=
set nomnue=
:bucle2
if "%1"=="" (
   Copy "%carpeta%%nomant%" "%carpeta%%nomant%.tmp">nul
 del /q "%carpeta%%nomant%">nul 2>&1
 copy "%carpeta%%nomant%.tmp" "%carpeta%%nomnue%">nul
 del /q "%carpeta%%nomant%.tmp">nul 2>&1
 goto :eof
   )
set palabra=%1
set Inicial=%palabra:~0,1%
set Resto=%palabra:~1%
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set Inicial=!Inicial:%%x=%%x!
if not "%Resto%"=="" for %%x in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set Resto=!Resto:%%x=%%x!
if not "%nomant%"=="" set nomant=%nomant% %1&set nomnue=%nomnue% %Inicial%%Resto%
if "%nomant%"=="" set nomant=%1&set nomnue=%Inicial%%Resto%
shift
goto :bucle2

Y ya he resuelto el problema que hacía que no se trataran adecuadamente los nombres en los que había más de un espacio entre palabras. Eso sí, ahora en el nombre final se suprimen los espacios múltiples y se sustituyen por un único espacio, que creo que es lo más razonable. Esta es la versión para "ejecución desde registro":

@echo off
Setlocal EnableDelayedExpansion
set carpeta=%~d1%~p1
call :renombrar "%~n1%~x1" %~n1%~x1
:renombrar
set nomant=%~1
set nomnue=
shift
:bucle2
if "%1"=="" (
   Copy "%carpeta%%nomant%" "%carpeta%%nomant%.tmp">nul
 del /q "%carpeta%%nomant%">nul 2>&1
 copy "%carpeta%%nomant%.tmp" "%carpeta%%nomnue%">nul
 del /q "%carpeta%%nomant%.tmp">nul 2>&1
 goto :eof
   )
set palabra=%1
set Inicial=%palabra:~0,1%
set Resto=%palabra:~1%
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set Inicial=!Inicial:%%x=%%x!
if not "%Resto%"=="" for %%x in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set Resto=!Resto:%%x=%%x!
if not "%nomnue%"=="" set nomnue=%nomnue% %Inicial%%Resto%
if "%nomnue%"=="" set nomnue=%Inicial%%Resto%
shift
goto :bucle2

Para la versión con "ejecución por enviar a" sería:

@echo off
Setlocal EnableDelayedExpansion
:bucle1
if "%~1"=="" goto :eof
set carpeta=%~d1%~p1
call :renombrar "%~n1%~x1" %~n1%~x1
shift
goto :bucle1
:renombrar
del /q "%carpeta%kkk.txt">nul 2>&1
set nomant=%~1
set nomnue=
shift
:bucle2
if "%1"=="" (
   Copy "%carpeta%%nomant%" "%carpeta%kkk.txt">nul
 del /q "%carpeta%%nomant%">nul 2>&1
 copy "%carpeta%kkk.txt" "%carpeta%%nomnue%">nul
 del /q "%carpeta%kkk.txt">nul 2>&1
 goto :eof
   )
set palabra=%1
set Inicial=%palabra:~0,1%
set Resto=%palabra:~1%
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set Inicial=!Inicial:%%x=%%x!
if not "%Resto%"=="" for %%x in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set Resto=!Resto:%%x=%%x!
if not "%nomnue%"=="" set nomnue=%nomnue% %Inicial%%Resto%
if "%nomnue%"=="" set nomnue=%Inicial%%Resto%
shift
goto :bucle2

Creo que con esto voy a dar por cerrada la consulta a no ser que encuentres algún otro problemilla. Me ha gustado mucho y he aprendido cosas muy interesantes gracias a ti.

Fiel a mi costumbre de detectar errores después de haberle dado a ENVIAR, veo que falta un GOTO :EOF en la primera versión entre el CALL :RENOMBRAR y el :RENOMBRAR. Creo que no afecta mucho pero no queda "elegante"

Muchisimas gracias a ti por el tiempo, esfuerzo y el gran trabajo realizado
De los dos modos funciona perfecto.
lo unico que si en la seleccion de archivos se encuentra una carpeta no la renombra.
he solucionado el problema del icono.

la clave del registro quedaria asi.

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\Capitalizar]
@="Capitalizar"
"icon"="C:\\C\\Capitalizar.ico"
[HKEY_CLASSES_ROOT\*\shell\Capitalizar\command]
@="\"C:\\C\\Capitalizar.bat\" \"%1\""

Claro. El bat, tal como está, solo vale para archivos. No sé si valdría la pena intentar incluir carpetas.

Ya que has resuelto lo del icono, yo incluí en mis pruebas un ufo.ico que visto en el explorador presenta una imagen graciosa, pero en el desplegable del botón derecho no se ve esa imagen, solo un icono como de documento de texto. He probado con otros archivos ICO y no cambia la cosa. ¿Tiene qué tener alguna peculiaridad el archivo ICO para que se vea bien?

El icono lo he creado desde una imagen y lo he convertido a ico con un programa llamado PhotoFiltre Studio.

En herramientas convertir a icono 32x32. Pero igual con formato 48x48 o 96x96 valdría

Si subes la imagen pruebo a convertirlo.

Saludos

No hace falta, era solo curiosidad ya que me has abierto esa puerta. Pues creo que el UFO.ICO era de 32x32 según el explorador (ahora no estoy en casa y no puedo verlo). Estuve viendo los DefaultIcon de muchas de las CLASSES y parecen ser programas o DLL, lo que me hace pensar que podría tratarse, en esos casos, de iconos "embebidos". Pero, insisto, no hace falta de momento. Si más adelante lo necesito ya recurriré a ti.

Ok muchas gracias por todo.

Saludos

Al releer tu mensaje, ya en casa, en el que hablabas de que ya habías conseguido que saliera el icono, he visto que la sintaxis en la que me había basado era incorrecta. Aplicando la correcta que me indicas ya me sale el icono correctamente. De modo que también queda cerrado este punto.

Ok me alegro que haya sido por eso.

Saludos.

Ha sido muy instructiva esta consulta. Ya lo dije antes pero si no contesto algo me sigue figurando como pendiente. De modo que no digas nada más o volverá a quedarse pendiente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas