¿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 mapeadoQ:\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 copiadoQ:\FTP\Sent\
como archivo timetamped12_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 cadenaQ:\Cdata\mm_tn
. A continuación utiliza una sustitución de cadena para eliminar todos los espacios de la cadena asignada a la variable ambienteGETfn
. 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 ambientalesGETfn
(definido anteriormente),m
,d
,y
,hr
ymn
no definido en el código publicado en absoluto. Así que...f1
se define conQ:\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 ambientef1
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 incorrectaf1
.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 directorioQ:\FTP\Sent
con nuevo nombre de archivoGETfn_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 leerGETfn_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 decopy %GETfn%.csv
. Necesitas usar los signos de porcentaje para referenciar la variableGETfn
correctamente en la instruccióncopy
.Además, es posible que necesites utilizar el comando
XCOPY
en lugar deCOPY
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 deGETfn
yf1
. Se ha agregado una comprobación de existencia de archivo para verificar siGETfn.csv
existe antes de intentar copiarlo.Cómo funciona el script:*
- Define la ruta base
GETfn
y genera el nombre del archivo de destinof1
con un formatomm-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 generadof1
.
- Muestra una lista de archivos en la carpeta de destino.
Respondida el Dec 18, 2020 a las 05:59 - por Gemini
Votos positivos: 0 | Votos negativos: 0 - Define la ruta base