elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Batch] Duda con instrucción
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Batch] Duda con instrucción  (Leído 3,393 veces)
lsfer010

Desconectado Desconectado

Mensajes: 4


Ver Perfil
[Batch] Duda con instrucción
« en: 11 Octubre 2017, 01:14 am »

Buenas amigos, presento un problema (apenas estoy empezando a aprender batch), necesito mover unos archivos, donde partes del directorio las va a introducir el usuario a través de variables pero la consola me detecta la variable y no el contenido en si, por tanto no encuentra la dirección, les muestro el código:
Código:
move "L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\%nombre%?.cas" "L:\Juegos 2\%nombre%\%fecha% - %nombre%\MSX MSX\CAS"
¿Qué me estará faltando para que detecte el contenido de la variable?
¿Existe algún modificador para que mueva todos los archivos que tengan el mismo nombre? (Hasta cierto carácter)
Agradezco su ayuda prestada.
Saludos.


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.817



Ver Perfil
Re: [Batch] Duda con instrucción
« Respuesta #1 en: 11 Octubre 2017, 03:48 am »

¿Qué me estará faltando para que detecte el contenido de la variable?

La sintaxis del código que has mostrado es correcta, que no te funcione depende de otros factores. Muestra el resto del código relevante.

¿Qué ocurre si ejecutas el siguiente comando?, ¿se muestra correctamente el valor de las variables?:
Código:
Echo "L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\%nombre%?.cas" "L:\Juegos 2\%nombre%\%fecha% - %nombre%\MSX MSX\CAS"

En caso negativo entonces solo puede haber dos posibles explicaciones: 1. no has asignado un valor a las variables, o 2. estás reasignando el valor de las variables dentro de un bloque FOR o de una subrutina/label y entonces debes habilitar la expansión de variables en tiempo de ejecución, lo que se resolvería de la siguiente manera:

Código
  1. @Echo OFF
  2. SetLocal EnableDelayedExpansion
  3. Set "nombre=valor"
  4. Set "fecha=valor"
  5. ...
  6. Move "L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\!nombre!?.cas" "L:\Juegos 2\!nombre!\!fecha! - !nombre!\MSX MSX\CAS"

Información más detallada y ejemplos de uso:

Nota: ¿te has dado cuenta de que el nombre del directorio "J Pednitentes" está mal escrito?, asegúrate bien de que el directorio existe y no sea ese el error...



¿Existe algún modificador para que mueva todos los archivos que tengan el mismo nombre? (Hasta cierto carácter)

Si, puedes usar el símbolo del asterisco * y también el símbolo de interrogante ? para definir reglas básicas de coincidencias en el patrón de búsqueda por nombre...

Imagínate que tienes los siguientes archivos en el directorio C:\
Código:
Archivo_1.txt
Archivo_22.txt
Archivo_333.txt
Archivo000.txt
Pedro.txt
...y solo quieres mover los archivos cuyo nombre de archivo acaben con guión bajo seguido de una enumeración ("Archivo_1.txt", "Archivo_22.txt", y Archivo_333.txt), entonces utilizarías la siguiente sintaxis:
Código
  1. Move "C:\Archivo_*.txt" "C:\Destino\"

Información más detallada y ejemplos de uso:

Saludos.


« Última modificación: 11 Octubre 2017, 03:54 am por Eleкtro » En línea

lsfer010

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: [Batch] Duda con instrucción
« Respuesta #2 en: 11 Octubre 2017, 04:02 am »

Muchas gracias @Eleкtro, te dejo a continuación el código completo de lo que estoy haciendo y voy a intentar lo que me dices.
Código:
@echo off
title Mover Archivo
cd L:\Juegos 2
set/p "nombre=Introduzca nombre:"
set/p "fecha=Introduzca fecha:"
md "%nombre%"
cd %nombre%
md %fecha%" - ""%nombre%"
cd %fecha%" - "%nombre%
md "MSX MSX"
cd MSX MSX
md CAS
move "L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\%nombre%?.cas" "L:\Juegos 2\%nombre%\%fecha%" - "%nombre%\MSX MSX\CAS"
pause
exit

#ACTUALIZACIÓN: Ya ejecute la línea de código echo con las rutas que me proporcionaste para revisar que si tomara los valores. Esto fue lo que imprimió:
Código:
"L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\Can of Worms?.cas" "L:\Juegos 2\Can of Worms\1986 - Can of Worms\MSX MSX\CAS"
Nota: (nombre=Can of Worms , fecha=1986)
Nota 2: El archivo completo se llama "Can of Worms (1986)(Livewire Software)(GB)[RUN'CAS-'].cas", la idea del poner el ? fue de que tomara todos los archivos que comiencen con "Can of Worms"

Las rutas se han copiado desde el explorador de archivos, entonces el error que me comentas de "J Pednitentes" si es intencional me equivoque al escribirlo cuando creé esa carpeta desde el explorador jeje  :xD .
Explico la intención de este código:
Poseo una colección de ROOMS de juegos y software de sistemas antiguos (MSX, Commodore, MS-DOS, etc.) y quiero organizar por Franquicia\Año de salida - Entrega\Plataforma\Formato de la ROM (si aplica) en la carpeta Juegos 2 (Se llama así porque el disco esta en FAT32 y otra carpeta juegos 1 ya no acepta mas carpetas) dentro de la unidad L:.
Por el momento que estoy aprendiendo batch, hago que la aplicación me pida los datos y creé los directorios y mueva archivos automáticamente, pero ya posteriormente espero que además pueda ubicarse en la carpeta de las rooms sin organizar y tome en automático el nombre y fecha del primer elemento y así en un ciclo o en un goto.
Muchas gracias por responder, saludos.
« Última modificación: 11 Octubre 2017, 04:23 am por lsfer010 » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.817



Ver Perfil
Re: [Batch] Duda con instrucción
« Respuesta #3 en: 11 Octubre 2017, 05:42 am »

Esta linea la has cambiado en el último código que has mostrado:
Citar
Código:
move "L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\%nombre%?.cas" "L:\Juegos 2\%nombre%\%fecha%" - "%nombre%\MSX MSX\CAS"

Si eso lo tienes así en tu script actual, entonces le estás pasando tres argumentos de más al comando Move y probablemente por eso no te funcione:
Código:
"L:\Juegos 2\%nombre%\%fecha%" - "%nombre%\MSX MSX\CAS"

1. "L:\Juegos 2\%nombre%\%fecha%"
2. "-"
3. "%nombre%\MSX MSX\CAS"

Debes encerrar todo el argumento entre comillas dobles como mostraste en tu primer script:
Código:
"L:\Juegos 2\%nombre%\%fecha% - %nombre%\MSX MSX\CAS"



De todas formas en ese código que has msotrado estás realizando bastante cantidad de pasos innecesarios que puedes reducir a simplemente esto:

Código
  1. @Echo OFF & Title Mover Archivo
  2.  
  3. SET /P "name=Introduzca nombre:"
  4. SET /P "year=Introduzca fecha:"
  5.  
  6. Set "dirPath=L:\Juegos 2\%name%\%year% - %name%\MSX MSX\CAS\"
  7. MKDIR "%dirPath%"
  8.  
  9. MOVE "L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\%name%.cas" "%dirPath%"
  10.  
  11. Exit /B 0

Ese código debería funcionarte...siempre que la ruta de origen exista ( "L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\%name%.cas" ). Pruébalo.

PD: Por cierto, seguro que el nombre de la carpeta de destino debe ser "MSX MSX", y no "MSX\MSX? (dos carpetas), lo pregunto por que en la ruta de origen tienes dos carpetas llamadas "MSX", no una carpeta "MSX MSX". Yo creo que a lo mejor por ahí has tenido otro fallo al escribir la ruta XD...



posteriormente espero que además pueda ubicarse en la carpeta de las rooms sin organizar y tome en automático el nombre y fecha del primer elemento y así en un ciclo

¿Y has pensado que ocurriría si el nombre de la ROM/carpeta contiene un guión?, por ejemplo: "metal-gear - 1987", seguro que tienes alguna ROM con guión en el nombre.

Sería muy tedioso intentar parsear correctamente nombres así para prevenir falsos positivos en un "lenguaje" tan limitado como Batch, para eso te conviene más usar expresiones regulares...en cualquier otro lenguaje (mi recomendación personal: PowerShell).

Saludos
« Última modificación: 11 Octubre 2017, 05:55 am por Eleкtro » En línea

lsfer010

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: [Batch] Duda con instrucción
« Respuesta #4 en: 11 Octubre 2017, 06:34 am »

Perfecto gracias por las observaciones y los consejos, te comento que ya funciono el programa  ;-) , aunque me surgió otro problema, hasta abajo lo comento. Esto fue lo que hice para que funcionara:
Este es el código final, aunque con el último mensaje que me enviaste lo voy a reducir  ;D
Código:
@echo off
title Mover Archivo
cd L:\Juegos 2
:repetir
SetLocal EnableDelayedExpansion
set/p "nombre=Introduzca nombre:"
set/p "fecha=Introduzca fecha:"
md "!nombre!"
cd !nombre!
md "!fecha! - !nombre!"
cd !fecha!" - "!nombre!
md "MSX MSX"
cd MSX MSX
md CAS
move "L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\!nombre!*.cas" "L:\Juegos 2\!nombre!\!fecha! - !nombre!\MSX MSX\CAS"
pause
goto repetir
exit

Básicamente, remplace todos los % por ! y ahora si me detectaba el contenido de variables, y el ? que usaba en \!nombre!?.cas" para que detectara los que se repitieran, no me funciono pero lo remplace por el * y ahora si  ::)

Sobre lo que comentas en la línea que se modifico en el último mensaje, si me di cuenta cuando vi que estaba creando como 4 carpetas xD pero ya esta arreglado.

Tomare tu recomendación para reducir pasos  :D, Sobre tu posdata, lo que pasa que en la ruta de origen si son dos carpetas MSX, ya que cuando descargue la colección así venia, porque en la raíz estaba la colección de carpetas por compañia (en este caso MSX) y dentro de ella estaban los diferentes sistemas de la compañia (MSX y MSX2).
En la carpeta destino, si lo estoy poniendo como "MSX MSX" para indicar compañia y sistema.

Ahora bien, se puede ver en el último código que publique que puse un goto, lo que pasa es que quiero que se repita el programa para no tener que estarlo abriendo cada que finalice el proceso, pero solo funciona una vez, cuando repite me marca un error ("No se pueden mover varios archivos a un solo archivo"). Siento que hay un problema con las variables, ¿habrá forma de limpiarlas después de la etiqueta del goto?

Y ya mencionado esto, si es cierto lo que dices, batch por lo que veo es muy limitado, el problema es que ocupaba esta aplicación "urgentemente" (acomodar mas de 100,000 rooms manualmente no es nada bonito  :xD te quita demasiado tiempo) y pues preguntando en un grupo de FaceBook me recomendaron que, para aprender algo rápido usara batch, y me parecio buena idea ya que tenia poquitos conocimientos de MS-DOS.
Por el momento solo quiero que esta aplicacion pueda repetir el proceso, mas adelante si necesito ahorrar mas tiempo estudiare PowerShell como me recominedas. Ya habia pensado hacerlo en C# pero he llevado casi nada de C xD

Agradezco mucho tu ayuda, espero se pueda solucionar el último problema. Saludos  ;D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda batch
Scripting
CrÄsH 6 3,651 Último mensaje 29 Abril 2007, 13:45 pm
por nhaalclkiemr
Cómo sería esta instrucción en Batch?
Scripting
ramonecaxa 3 2,861 Último mensaje 12 Octubre 2007, 07:47 am
por Crazy.sx
Pequeña duda con un comando batch (NUEVA DUDA RELACIONADA)
Scripting
revenge1252 9 9,745 Último mensaje 13 Febrero 2008, 21:41 pm
por revenge1252
[DUDA] Cambiar letra de unidad a archivo con un Batch [DUDA] « 1 2 »
Windows
MrMaticool 10 11,303 Último mensaje 12 Febrero 2014, 17:55 pm
por MrMaticool
Duda, instrucción shutdown() - sockets python
Scripting
painpills 1 1,933 Último mensaje 4 Julio 2021, 23:27 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines