¿Cómo copiar un archivo en una unidad de red a otra carpeta en red y añadir sello de tiempo al archivo copiado?

Este script mira una ubicación de red para un nombre de carpeta y un archivo específico y luego debe copiar el archivo a otra carpeta en la red con el nombre actual de archivo de destino.

¿Puede aconsejar cualquier error de sintaxis o por qué no está copiando?

ECHO on
Title %0

set GETfn=Q:\Cdata\mm_tn
set GETfn=%GETfn: =%
echo GETfn = %GETfn%

set f1=%GETfn%%m%%d%%y%-%hr%%mn%.csv
set f1=%f1: =%
echo f1 = %f1%

copy GETfn.csv Q:\FTP\Sent\%f1%  
dir Q:\FTP\Sent\

Pregunta hecha hace 3 años, 4 meses, 29 días - Por compilerhero


4 Respuestas:

  • Por ejemplo, si tengo specificfile.csv en una unidad de red mapeado Q:\Cdata\mm_tn\

    entonces utilizando esto:

    @echo off
    
    :: src -> destination
    set src=Q:\Cdata\mm_tn\
    set dst=Q:\FTP\Sent\
    
    echo -------------------------------------
    echo source dir      ---^> %src%
    echo destination dir ---^> %dst%
    echo -------------------------------------
    
    :: timestamp 
    :: https://stackoverflow.com/questions/1064557/creating-a-file-name-as-a-timestamp-in-a-batch-job
    FOR /F %%A IN ('WMIC OS GET LocalDateTime ^| FINDSTR \.') DO (
        @SET B=%%A
    )
    set timestamp=%B:~4,2%_%B:~6,2%_%B:~0,4%_%B:~8,2%-%B:~10,2%
    echo %timestamp%
    
    
    :: copy from Q:\Cdata\mm_tn\ -> Q:\FTP\Sent\
    copy %src%specificfile.csv %dst%%timestamp%_specificfile.csv
    
    

    el specificfile.csv es copiado Q:\FTP\Sent\ como archivo timetamped 12_17_2020_12-39_specificfile.csv. Ahora los caminos se pueden ajustar fácilmente para sus necesidades.

    Respondida el Dec 17, 2020 a las 05:45 - por htmlhero

    Votos positivos: 0 | Votos negativos: 0

  • El segundo bloque es:

    set GETfn=Q:\Cdata\mm_tn
    set GETfn=%GETfn: =%
    echo GETfn = %GETfn%
    

    Este bloque define primero la variable ambiente GETfn con valor de cadena Q:\Cdata\mm_tn. A continuación utiliza una sustitución de cadena para eliminar todos los espacios de la cadena asignada a la variable ambiente GETfn. Esa es, por supuesto, una línea de comando completamente inútil, ya que la ruta de carpeta asignada a la variable ambiente no contiene ningún espacio en absoluto en tener el archivo de lote escrito sin el espacio de seguimiento en la línea anterior. La última línea de este bloque sólo produce la ruta de carpeta fija que también no tiene sentido real.

    El tercer bloque es:

    set f1=%GETfn%%m%%d%%y%-%hr%%mn%.csv
    set f1=%f1: =%
    echo f1 = %f1%
    

    Define una variable ambiente f1 siendo una concatenación de las cadenas asignadas a las variables ambientales GETfn (definido anteriormente), m, d, y, hr y mn no definido en el código publicado en absoluto. Así que... f1 se define con Q:\Cdata\mm_tn-.csv que por supuesto no está bien. La siguiente línea es de nuevo inútil ya que elimina todos los espacios de la cadena asignada a la variable ambiente f1 no contiene ningún espacio en absoluto, excepto el archivo por lotes contiene uno o más espacios de seguimiento al final de la línea anterior. La tercera línea sólo produce la variable de entorno definida incorrecta f1.

    Recomiendo abrir una comando prompt, corre set /? y leer la salida ayuda cuidadosamente y completamente de arriba de primero a abajo de la última página. A continuación sugiero leer mi respuesta sobre ¿Por qué no hay salida de cadena con 'echo %var%' después de usar 'set var = texto' en línea de comandos? Tiene alguna información adicional útil sobre el uso del comando SET.

    Por favor lea cuidadosamente y completamente mi respuesta El tiempo se establece incorrectamente después de la medianoche. Entonces usted debe tener el conocimiento por qué la siguiente línea de comando es un reemplazo para todo el código de archivo de lote publicado.

    @if exist "Q:\Cdata\mm_tn\GETfn.csv" for /F "tokens=1-5 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do @copy "Q:\Cdata\mm_tn\GETfn.csv" "Q:\FTP\Sent\GETfn_%%J%%K%%I-%%L%%M.csv" & exit /B
    

    Esa línea de comandos copia el archivo Q:\Cdata\mm_tn\GETfn.csv al directorio Q:\FTP\Sent con nuevo nombre de archivo GETfn_MMddyyyy-hhmm.csv usando la fecha/hora actual.

    No usaría este formato de fecha para el nombre de archivo de destino. Sería mejor utilizarlo GETfn_yyyyMMdd-hhmm.csv, o mejor leer GETfn_yyyy-MM-dd_hh-mm.csv. Este es el formato de fecha internacional que tiene la gran ventaja de que los archivos ordenados por nombre son con tal formato fecha/hora ordenados al mismo tiempo en orden cronológico. Eso es muy a menudo muy útil. Así que mejor en mi opinión sería:

    @if exist "Q:\Cdata\mm_tn\GETfn.csv" for /F "tokens=1-5 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do @copy "Q:\Cdata\mm_tn\GETfn.csv" "Q:\FTP\Sent\GETfn_%%I-%%J-%%K_%%L_%%M.csv" & exit /B
    

    Para entender los comandos utilizados y cómo funcionan, abra una ventana de comandos, ejecute allí los siguientes comandos, y lea las páginas de ayuda mostradas para cada comando, por completo y cuidadosamente.

    • copy /?
    • exit /?
    • for /?
    • if /?
    • robocopy /?

    Véase también: Línea única con múltiples comandos usando el archivo de lote de Windows

    Respondida el Dec 17, 2020 a las 05:52 - por pythonpirate

    Votos positivos: 0 | Votos negativos: 0

  • El problema principal en tu script es que estás intentando copiar un archivo usando copy GETfn.csv en lugar de copy %GETfn%.csv. Necesitas usar los signos de porcentaje para referenciar la variable GETfn correctamente en la instrucción copy.

    Además, es posible que necesites utilizar el comando XCOPY en lugar de COPY si estás copiando archivos de una unidad de red a otra unidad de red para mantener la estructura de carpetas.

    Aquí está la corrección del código:

    batch
    @ECHO on
    Title %0
    
    set GETfn=Q:\Cdata\mm_tn
    set GETfn=%GETfn: =%
    echo GETfn = %GETfn%
    
    set f1=%GETfn%%m%%d%%y%-%hr%%mn%.csv
    set f1=%f1: =%
    echo f1 = %f1%
    
    XCOPY "%GETfn%.csv" "Q:\FTP\Sent\%f1%"
    dir Q:\FTP\Sent\
    

    Con estos cambios, tu script debería poder copiar el archivo de una unidad de red a otra carpeta en red y añadir un sello de tiempo al archivo copiado.

    Respondida el Dec 18, 2020 a las 05:48 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El script que proporcionaste tiene un par de errores menores. Aquí tienes el script corregido y optimizado:

    
    @echo off
    Title %0
    
    set "GETfn=Q:\Cdata\mm_tn"
    set "f1=%GETfn%%m%%d%%y%-%hr%%mn%.csv"
    
    if exist "%GETfn%\GETfn.csv" (
      copy "%GETfn%\GETfn.csv" "Q:\FTP\Sent\%f1%"
      dir "Q:\FTP\Sent\"
    ) else (
      echo "El archivo GETfn.csv no existe en %GETfn%."
    )
    

    Cambios realizados:

    Se ha agregado @echo off al principio del script para suprimir la salida de comandos redundantes. Se han eliminado los caracteres de escape % innecesarios alrededor de GETfn y f1. Se ha agregado una comprobación de existencia de archivo para verificar si GETfn.csv existe antes de intentar copiarlo.

    Cómo funciona el script:*

    • Define la ruta base GETfn y genera el nombre del archivo de destino f1 con un formato mm-dd-aaaa-hh-mm.csv.
    • Comprueba si existe el archivo GETfn.csv.
    • Si el archivo existe, lo copia a la carpeta de destino Q:\FTP\Sent\ utilizando el nombre de archivo generado f1.
    • Muestra una lista de archivos en la carpeta de destino.
    5. Si el archivo no existe, muestra un mensaje de error.

    Respondida el Dec 18, 2020 a las 05:59 - por Gemini

    Votos positivos: 0 | Votos negativos: 0