[BATCH] Copiado con confirmacion de correcta escritura

Iniciado por ovichan, 24 Octubre 2013, 02:13 AM

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

ovichan

Hola a todos, he creado un bat para copiar una serie de archivos en un disco externo y mi intencion es que me saque en pantalla los archivos que se han copiado y si ha habido fallos o no. El script es el siguiente, sin embargo, no se si realmente cumple el objetivo del script o conceptualmente me he equivocado.

Código (bash) [Seleccionar]
@echo off
Title Copiar

if not exist "I:\Carpeta" md "I:\Carpeta"

for %%@ in (*.mkv) do (

copy "%%@" "I:\Carpeta" /Y 1>nul & Echo El archivo: "%%@" fue copiado correctamente. || Echo Hubo un fallo al copiar el archivo "%%@".
        echo.

)

pause>nul&exit


He pensado que si está mal, quizás con %ERRORLEVEL% podría sería mejor pero ya implementarlo a esa linea se me escapa. Gracias.

Eleкtro

#1
Solo tienes una cosa mal, el operador & se va a procesar siempre aunque el copy falle... así que por ende el || nunca se va a procesar.

Código (dos) [Seleccionar]
copy /Y "%%@" "I:\Carpeta\" 1>nul 2>&1 && (
Echo El archivo: "%%@" fue copiado correctamente.
) || (
Echo Hubo un fallo al copiar el archivo "%%@".
)


Citar   commandA &  commandB      Run commandA and then run commandB
  commandA && commandB      Run commandA, if it succeeds then run commandB
  commandA || commandB      Run commandA, if it fails then run commandB

Saludos.








ovichan

Gracias, ya imaginaba yo q lo habría hecho mal jeje.

ovichan

Hola estoy implementando este script,para que una vez que compruebe que el archivo de destino no existe borre el que este en el destino y tenga similar nombre. Me explico, mi intencion por ejemplo es copiar un archivo llamado:

[EvoShare] Dragon Ball Z 001 - Aparece un mini Gokuh! Soy Gohan [DVD+DVD] [DUAL+SUBS] by overdrive [DB80E46B].mkv

Y este archivo ira a una carpeta "I:\Dragon Ball GT\". Si alli encuentra un archivo similar en nombre pero con distinto numero de CRC, quiero que elimine el archivo de destino y a continuacion copie el que tengo.

Bueno por ahora tengo esto que funciona, pero me quedo en un punto donde no hay retorno ^^:

Código (dos) [Seleccionar]
:: Hacer lista en la unidad destino
if exist "E:\Dragon Box GT\I\lista.txt" erase "E:\Dragon Box GT\I\lista.txt"

For %%@ in ("E:\Dragon Box GT\I\*.mkv") do (
echo %%~n@>>"E:\Dragon Box GT\I\lista.txt"
)

:: Otra fase
for %%@ in (*.mkv) do (
if not exist "I:\Dragon Ball GT\%%@" (
cd "E:\Dragon Box GT\I\"

for /f "tokens=1,2 delims=][" %%i in (lista.txt) do (

set destino=%%j

for /f "tokens=1,2 delims=][" %%a in ("%%@") do (
set original=%%b
call echo %%original%%
call echo %%destino%%
if %original%=%destino% erase ....
)

)

rem copy "%%@" "I:\Dragon Ball GT" /Y 1>nul 2>&1 && Echo El archivo: "%%@" fue copiado correctamente. || Echo Hubo un fallo al copiar el archivo "%%@".
)
)


Como se puede ver he comprobado la parte del filename que considero clave, vamos el titulo, ya que anteriormente con el primer If se ha realizado un discriminante, y se sabe que el archivo a copiar es diferente. Sin embargo en el IF del tercer FOR ya no paso, no se como puedo hacer para que borrase el archivo que este en "I:\Dragon Ball GT\[EvoShare] Dragon Ball Z 001 - Aparece un mini Gokuh! Soy Gohan [DVD+DVD] [DUAL+SUBS] by overdrive [0001100].mkv"

¿Alguna sugerencia? Quizas esta un poco lioso pero no sabria como abarcarlo de otra manera.

Eleкtro

Cita de: ovichan en 28 Octubre 2013, 00:51 AM¿Alguna sugerencia? Quizas esta un poco lioso pero no sabria como abarcarlo de otra manera.

No es nada práctico hacer estas tareas en Batch, creo que manejas un poco Python, sería todo mucho más sencillo usando expresiones regulares puesto que el CRC es una representación hexadecimal.

Si no he entendido mal quieres comprobar si el archivo de origen existe en la carpeta destino pero con otro CRC distinto, pues vamos allá en Batch...

@Echo OFF & Setlocal enabledelayedexpansion

:: Setear variables
Set "DBGT=E:\Dragon Box GT"
Set "LIST=%DBGT%\I\lista.txt"

Set "FILE_ORIGIN="
Set "NAME_ORIGIN="
Set "CRC_ORIGIN="

Set "FILE_DESTINY="
Set "NAME_DESTINY="
Set "CRC_DESTINY="

:: Hacer lista en la unidad destino
REM Borrar la lista ya no es necesario
REM If exist "%LIST%" (erase "%LIST%")
REM (For %%# in ("%DBGT%\I\*.mkv") DO (Echo %%~n#))>"%LIST%"

:: Otra fase
For %%# in ("*.mkv") do (

Set "FILE_ORIGIN=%%~f#"
Set "NAME_ORIGIN=%%~n#"
REM "FILE_ORIGIN=C:\Users\Administrador\Desktop\[EvoShare] Dragon Ball Z 001 - Aparece un mini Gokuh! Soy Gohan [DVD+DVD] [DUAL+SUBS] by overdrive [DB80E46B].mkv"
REM "NAME_ORIGIN=[EvoShare] Dragon Ball Z 001 - Aparece un mini Gokuh! Soy Gohan [DVD+DVD] [DUAL+SUBS] by overdrive [DB80E46B]"

For /F "tokens=7 delims=[]" %%C in ("%%~n#") DO (Set "CRC_ORIGIN=%%C")
REM "CRC_ORIGIN=DB80E46B"

Call Set "NAME_ORIGIN=%%NAME_ORIGIN:[!CRC_ORIGIN!]=%%"
REM "NAME_ORIGIN=[EvoShare] Dragon Ball Z 001 - Aparece un mini Gokuh! Soy Gohan [DVD+DVD] [DUAL+SUBS] by overdrive "

For /F "Delims=" %%# in ('Dir /B /S "%DBGT%\*.mkv" | FIND /I "!NAME_ORIGIN!"') Do (
Set "FILE_DESTINY=%%~f#"
Set "NAME_DESTINY=%%~n#"
)
REM "FILE_DESTINY=E:\Dragon Box GT\[EvoShare] Dragon Ball Z 001 - Aparece un mini Gokuh! Soy Gohan [DVD+DVD] [DUAL+SUBS] by overdrive [ABCDEF00].mkv"
REM "NAME_DESTINY=[EvoShare] Dragon Ball Z 001 - Aparece un mini Gokuh! Soy Gohan [DVD+DVD] [DUAL+SUBS] by overdrive [ABCDEF00]"

For /F "tokens=7 delims=[]" %%C in ("!NAME_DESTINY!") DO (Set "CRC_DESTINY=%%C")
REM "CRC_DESTINY=ABCDEF00"

Echo Origen:
Echo File: !FILE_ORIGIN!
Echo Name: !NAME_ORIGIN!
Echo CRC : !CRC_ORIGIN!
Echo+
Echo Destino:
Echo File: !FILE_DESTINY!
Echo Name: !NAME_DESTINY!
Echo CRC : !CRC_DESTINY!
Echo+
Echo copiar:
Echo Copy "!FILE_ORIGIN!" "%DBGT%\"
Pause

If NOT "!CRC_ORIGIN!" EQU "!CRC_DESTINY!" (
ERASE "!FILE_DESTINY!"
Copy "!FILE_ORIGIN!" "%DBGT%\" 1>nul 2>&1 && (
Echo El archivo: "!FILE_ORIGIN!" fue copiado correctamente.
) || (
Echo Hubo un fallo al copiar el archivo "!FILE_ORIGIN!".
)
)

)

Pause&Exit



PD: Lo he escrito al vuelo, no he testeado el código, aviso

Un saludo!








ovichan

Gracias, voy a testearlo. Quizás es mejor q lo haga en python o vbs, tal y como dices. Ta luego.