Duda BATCH

Iniciado por jbelin, 20 Noviembre 2012, 13:50 PM

0 Miembros y 2 Visitantes están viendo este tema.

jbelin

Hola,

Necesitaria poder validar el nombre de archivos sin extensión y por un trozo del nombre mas o menos en mitad de ellos:
Ejemplo:
sjsadjgjgsdgasa_jhsajkdhjksa
jasdkashkjdhjsb_jhsakjdhksaj

IF NOT EXIST *a_* :NOHAY
ELSE :SIHAY


S!

$Edu$

Si no van a tener extension entonces no puede contener ningun "." (punto), podrias verificarlo en un For y usando el manejo de caracteres de un string con if %variable:~x,1% == "a_" donde x seria la variable que aumenta en el For. Asi vas checkeando cada caracter hasta el final, si verifica el if en algun caracter es porque existe, sino llegara al final y seguira sabiendo que no existe.

Eleкtro

#2
Buenas,

Usa expresiones regulares con el comando "FINDSTR", o sírvete del operador "?" de la siguiente manera:

Código (dos) [Seleccionar]
IF EXIST "*?_*" (Echo Si hay coincidencias) ELSE (Echo No hay coincidencias)

? = 1 caracter (Cualquiera)

EDITO: Si ese tipo de archivos tienen la misma longitud siempre (28 caracteres), y si el guión va a estar siempre en el mismo lugar, puedes adaptar mejor mi ejemplo para que no hayan falsos positivos:

Código (dos) [Seleccionar]
IF EXIST "???????????????_????????????"  (Echo Si hay coincidencias) ELSE (Echo No hay coincidencias)

Saludos.








jbelin

#3
Hola,

El problema es que parece que se salta la condicion, coge todos independientemente de lo que llegue (a_ o b_) con:

IF EXIST "*a_*" GOTO :SIHAY
ELSE GOTO :NOHAY


S!

Eleкtro

Cita de: jbelin en 20 Noviembre 2012, 16:05 PM
IF EXIST "*a_*" GOTO :SIHAY
ELSE GOTO :NOHAY

¿La sintaxis la tienes escrita en tu script exactamente como en los ejemplos que has expuesto?
De ser así, está mal y la línea del "ELSE" te dará error, haz un correcto uso de la sintaxis:

Código (dos) [Seleccionar]
IF EXIST "*a_*" (
    GOTO :SIHAY
) ELSE (
    GOTO :NOHAY
)


Esa condicional es correcta y solo toma los nombres que coincidan con el siguiente patrón:
"(CUALQUIER_SERIE_DE_CARACTERES)a_(CUALQUIER_SERIE_DE_CARACTERES)"

Si tampoco es eso lo que buscas o sigues teniendo dudas pon un ejemplo más claro y una pregunta algo más detallada.

Saludos








jbelin

#5
Hola Perfecto, parece que ya va :)
Solo una cosa mas...
Si una vez que descubre que existen...necesitaria realizar una copia de ellos a otra unidad y parece que no va muy fino :S

Código (dos) [Seleccionar]
COPY C:\a\*a_* D:\b

S!

Eleкtro

Antes de nada, cuando postees un código usa el botón "Insertar código", es una norma del foro.

Lo que estás haciendo es asignarle el nombre "b" al archivo de destino. Tienes que añadirle una barra diagonal a la ruta de destino para que el comando entienda que se trata de una carpeta y no un nombre archivo.

PD: Aparte, deberías acostumbrarte a encerrar los argumentos importantes en comillas dobles.

COPY "C:\a\*a_*" "D:\b\"

Un saludo!








jbelin

Disculpa, no habia caido...tndre mas cuidado.
El problema no es con las rutas.
El problema es en el filtro, si tengo archivos tanto (a_) como (b_), se lo salta y copia todos...cuando solo quiero copiar todos los que tengan (a_), por ejemplo.

S!

Eleкtro

#8
Cita de: jbelin en 20 Noviembre 2012, 17:44 PM
El problema es en el filtro, si tengo archivos tanto (a_) como (b_), se lo salta y copia todos...cuando solo quiero copiar todos los que tengan (a_), por ejemplo.

Si los archivos se llaman como en los ejemplos que proporcionaste entonces es imposible que eso suceda, como expliqué, la condicional de arriba era correcta y en el comando copy estás usando el mismo patrón.

Proporcioname el nombre completo del archivo (a_) y (b_) para ayudarte mejor (Si son los 2 archivos que pusiste en tu primer comentario reafirmo que es imposible que eso te suceda)

PD: Aparte, la ruta daba problemas si no usabas el slash (la barra diagonal, al final)

Prueba con este RegEx:
For %%# in (*) DO (Echo "%%#" | FINDSTR ".*a_.*" 1>NUL && Echo "%%#")

EDITO: Optimizado para tu propósito:
For %%# in ("C:\a\*") DO (Echo "%%#" | FINDSTR ".*a_.*" 1>NUL && Copy "%%#" "D:\b\")

un saludo