[Batch] Duda con instrucción

Iniciado por lsfer010, 11 Octubre 2017, 01:14 AM

0 Miembros y 1 Visitante están viendo este tema.

lsfer010

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:
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.

Eleкtro

#1
Cita de: lsfer010 en 11 Octubre 2017, 01:14 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?:
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 (dos) [Seleccionar]
@Echo OFF
SetLocal EnableDelayedExpansion
Set "nombre=valor"
Set "fecha=valor"
...
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...




Cita de: lsfer010 en 11 Octubre 2017, 01:14 AM¿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:\
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 (DOS) [Seleccionar]
Move "C:\Archivo_*.txt" "C:\Destino\"

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

Saludos.








lsfer010

#2
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.
@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ó:
"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.

Eleкtro

#3
Esta linea la has cambiado en el último código que has mostrado:
Citarmove "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:
"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:
"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 (dos) [Seleccionar]
@Echo OFF & Title Mover Archivo

SET /P "name=Introduzca nombre:"
SET /P "year=Introduzca fecha:"

Set "dirPath=L:\Juegos 2\%name%\%year% - %name%\MSX MSX\CAS\"
MKDIR "%dirPath%"

MOVE "L:\J Pednitentes\SISTEMAS SIN ORGANIZAR\PC\MSX\MSX\Games\[CAS]\%name%.cas" "%dirPath%"

Pause
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...




Cita de: lsfer010 en 11 Octubre 2017, 04:02 AMposteriormente 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








lsfer010

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
@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