Buenos días, tengo un detalle con un código de desencriptación que tengo en un batch, resulta que en la salida me genera un lote de archivos de tipo:
Archivo1.doc.encrypted.txt
Archivo2.doc.encrypted.txt
Archivo3.doc.encrypted.txt
.
.
Archivon.doc.encrypted.txt
El tema es que necesito una linea que me elimine el .encrypted.txt de todos los archivos que encuentre en esa ruta y me deje solo el nombre de el archivo con su extensión inicial.
Saludos y gracias de antemano
crea un archivo .bat en la carpeta donde esten los archivos y le pones
@echo off
for /F "tokens=1,2,3,4 delims='.'" %%a in ('dir /B *.encrypted.txt') do (move %%a.%%b.%%c.%%d %%a.%%b)
Cita de: kaisersouse2 en 17 Septiembre 2014, 16:44 PMBatch Eliminar Doble Extensión
Hola
Solo para dejar claro una cosa, en realidad los archivos tienen 1 sola extensión (que es: .txt), el resto que podriamos considerar extensiones (.doc, .encrypted) no lo son, eso se considera contenido del nombre del archivo (contenido con puntos) y por ende es imposible reconocerlos como extensiones
de manera eficiente.
Pero, como conoces exactamente la cadena que quieres eliminar y también conoces cuantas palabras con puntos son, la tarea es bien facil:
Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensajeParece que ya te contestaron :P
Saludos.
Cita de: daryo en 17 Septiembre 2014, 16:59 PM
crea un archivo .bat en la carpeta donde esten los archivos y le pones
@echo off
for /F "tokens=1,2,3,4 delims='.'" %%a in ('dir /B *.encrypted.txt') do (move %%a.%%b.%%c.%%d %%a.%%b)
me dice que la sintaxis no es correcta, help me please
[MOD]: No está permitido hacer doble post.
si ejecutas directamente el comando en ves de ponerlo en un archivo .bat y abrirlo cambia las %%a por %a las %%b por %b y asi con todos
que tal daryo sigue sin funcionar, apoyame con eso necesito el pez no la caña jajaja, necesito que lea todos los
Archivo1.doc.encrypted.txt
Archivo2.doc.encrypted.txt
Archivo3.doc.encrypted.txt
.
.
Archivon.doc.encrypted.txt
dentro de una carpeta y me elimine .encrypted.txt esos 14 caracteres y me deje por ejemplo solo:
Archivo1.doc
segui tus instrucciones al pie de la letra y no corrio
@kaisersouse2
No es necesario que me envies un email, usa el tema que abriste para formular preguntas.
@Echo OFF
For /F "Tokens=1-2,* delims=." %%a In ('Dir /B /A "*.encrypted.txt"') DO (
Echo "%%~fa.%%b.%%c" ^> "%%~fa.%%b"
Ren "%%~fa.%%b.%%c" "%%~na.%%b"
)
Pause&Exit
Saludos.
Disculpa bro soy nuevo en este tema de los foros
Cita de: kaisersouse2 en 17 Septiembre 2014, 18:19 PM
Disculpa bro soy nuevo en este tema de los foros
ok, no pasa nada :P
¿te funcionó el código?
saludos
funciono de maravilla, puedes explicarme así como para mongolico esa linea y cerrar el tema si puedes
Cita de: kaisersouse2 en 17 Septiembre 2014, 18:24 PM
funciono de maravilla, puedes explicarme así como para mongolico esa linea y cerrar el tema si puedes
CitarFor /F "Tokens=1-2,* delims=." %%a In ('Dir /B /A "*.encrypted.txt"') DO ()
En el parámetro 'Tokens' especifico que la cadena debe partirse en 3 partes (nombre, .doc, encrypted.txt), la variable %%a contiene el primer token (nombre), la variable %%b contiene el segundo token (.doc), y la variable %%c contiene el resto de la cadena (.encrypted.txt)
CitarRen "%%~fa.%%b.%%c" "%%~na.%%b"
Creo que esa linea no necesita explicaciones, uso el contenido de las variables (junto a los modificadores ~f y ~n) para especificar su ubicación y renombrar los archivos.
Usa la ayuda del comando si tienes dudas:
Rename.exe /?
muchisimas gracias hermano
Otra pregunta, lo hago en el mismo tema porque es parte del mismo codigo, como logro eliminar varios archivos de una carpeta excluyendo por ejemplo solo los .encrypted logre solo listarlos con dir /B/S/A-D | findstr /v "\.encrypted" pero no lo he podido hacer con del, gracias de antemano
prueba así
For /F "Delims=*" %%# in ('dir /B /S /A-D "%CD%\*" ^| find /v ".encrypted"') do (
Echo "%%~f#"
REM Del /Q "%%~f#"
)
saludos.
Excelente solo habia que eliminar el rem, saludos
Cita de: Eleкtro en 17 Septiembre 2014, 18:16 PM
@kaisersouse2
No es necesario que me envies un email, usa el tema que abriste para formular preguntas.
@Echo OFF
For /F "Tokens=1-2,* delims=." %%a In ('Dir /B /A "*.encrypted.txt"') DO (
Echo "%%~fa.%%b.%%c" ^> "%%~fa.%%b"
Ren "%%~fa.%%b.%%c" "%%~na.%%b"
)
Pause&Exit
Saludos Electro un gusto saludarte a un año de haberme ayudado con el código que me enviaste fue de mucha utilidad, pero como todo cambia incluso mi programa tengo una duda.
En el parámetro 'Tokens' se especifica que la cadena debe partirse en 3 partes (nombre, .doc, encrypted.txt), la variable %%a contiene el primer token (nombre), la variable %%b contiene el segundo token (.doc), y la variable %%c contiene el resto de la cadena (.encrypted.txt) todo esto esta muy bien, pero tengo un problema al tener un archivo con un nombre como por ejemplo:
"llave 1.2.pem.encrypted.txt" cuando corre el codigo en vez de eliminar solo el
.encrypted.txt me vuela el
.pem.encrypted quedando el archivo como
llave 1.2 debiendo quedar
llave 1.2.pem, esto es por darte un ejemplo, podría tener un archivo que se llamase loquesea 1.2.1.pem, no se si me explico, podrías ayudarme
Claro, en ese For utilicé el punto como delimitador asumiendo que el nombre "real" del archivo se puede tokenizar en 2 partes, si desconoces la cantidad de puntos que habrán en los nombres entonces debes recurrir a otra técnica, por ejemplo a un reemplazamiento de string:
@Echo OFF
Set "ext=encrypted.txt"
For %%_ In ("*.%ext%") DO (
Set "filename=%%~nx_"
Call Set "filename=%%filename:.%ext%=%%"
Call Echo "%%~nx_" - "%%filename%%"
Call Ren "%%~f_" "%%filename%%"
)
Pause&Exit
Saludos
Cita de: Eleкtro en 30 Septiembre 2015, 22:03 PM
Claro, en ese For utilicé el punto como delimitador asumiendo que el nombre "real" del archivo se puede tokenizar en 2 partes, si desconoces la cantidad de puntos que habrán en los nombres entonces debes recurrir a otra técnica, por ejemplo a un reemplazamiento de string:
@Echo OFF
Set "ext=encrypted.txt"
For %%_ In ("*.%ext%") DO (
Set "filename=%%~nx_"
Call Set "filename=%%filename:.%ext%=%%"
Call Echo "%%~nx_" - "%%filename%%"
Call Ren "%%~f_" "%%filename%%"
)
Pause&Exit
Saludos, Funciono de maravilla de hecho use un for /r para recursividad para que busque dentro de las carpetas que esten en ese directorio.
Otra cosa podrías como en anteriores ocasiones y también para los que lean esto en un futuro, como funciona el código, así como para dummies. y de nuevo gracias ;-).
Cita de: kaisersouse2 en 30 Septiembre 2015, 22:39 PMOtra cosa podrías como en anteriores ocasiones y también para los que lean esto en un futuro, como funciona el código, así como para dummies. y de nuevo gracias ;-).
Más bien voy a tener que epxlicarte cómo funciona la etiqueta
QUOTE, que me estás dando trabajo con eso corrigiendo las citas que haces xD.
El código es muy, muy sencillo, realmente no hay mucho que decir por que no hay nada así complicado, pero lo intentaré:
Primero de nada, establezco la extensión, asignándola a una variable para tener una referencia corta.
CitarSet "ext=encrypted.txt"
Luego, uso un For para iterar los archivos del directorio de trabajo, usando como patrón de búsqueda para los archivos la extensón de antes ("*.encrypted.txt")
CitarFor %%_ In ("*.%ext%") DO ...
La variable de FOR (
%%_) no nos sive de mucho ya que no sabemos la cantidad de puntos "." que puede contener un nombre de archivo, así que asigno a una nueva variable el nombre completo incluyendo la extensión:
CitarSet "filename=%%~nx_"
Seguidamente, hago un reemplazamiento de string para eliminar del nombre la extensión que habiamos asignado al principio (".encrypted.txt")
CitarCall Set "filename=%%filename:.%ext%=%%"
Y por último, renombramos el archivo.
CitarCall Ren "%%~f_" "%%filename%%"
Nota(s):
- El comando
Call es necesario por la expansión de variables, pero se puede reemplazar por el uso de
SetLocal EnableDelayedExpansion si uno quiere hacerlo.
- El modificador
~n de la variable de For devuelve el nombre del archivo, el modificador
~x la extensión, y el modificador
~f la ruta absoluta.
Saludos