此脚本查看网络位置中的文件夹名称和特定文件,然后将该文件复制到网络上的其他文件夹,并在目标文件名中包含当前时间戳。
您能指出任何语法错误或不复制的原因吗?
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\
例如,如果我在映射的网络驱动器上有
specificfile.csv
Q:\Cdata\mm_tn\
然后使用这个:
@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
将
specificfile.csv
作为带时间戳的文件 Q:\FTP\Sent\
复制到 12_17_2020_12-39_specificfile.csv
。现在可以根据您的要求轻松调整路径。
第二块是:
set GETfn=Q:\Cdata\mm_tn
set GETfn=%GETfn: =%
echo GETfn = %GETfn%
此块首先使用字符串值
GETfn
定义环境变量 Q:\Cdata\mm_tn
。接下来,它使用字符串替换来删除分配给环境变量 GETfn
的字符串中的所有空格。这当然是一个完全无用的命令行,因为分配给环境变量的文件夹路径根本不包含任何空格,而在上面的行上写入批处理文件时没有尾随空格。该块的最后一行仅输出固定文件夹路径,这也没有任何实际意义。
第三块是:
set f1=%GETfn%%m%%d%%y%-%hr%%mn%.csv
set f1=%f1: =%
echo f1 = %f1%
它定义了一个环境变量
f1
,它是分配给环境变量GETfn
(上面定义的)、m
、d
、y
、hr
和mn
(未定义)的字符串的串联完全发布了代码。所以 f1
是用 Q:\Cdata\mm_tn-.csv
定义的,这当然是不对的。下一行再次无用,因为它从分配给环境变量 f1
的字符串中删除了所有空格,根本不包含任何空格,除非批处理文件在上一行末尾包含一个或多个尾随空格。第三行只是输出错误定义的环境变量f1
。
我建议打开命令提示符,运行
set /?
并从第一页顶部到最后一页底部仔细完整地阅读输出帮助。接下来我建议阅读我的答案 Why is no string output with 'echo %var%' after using 'set var = text' on command line? 它有一些关于命令SET的使用的有用的附加信息。
请仔细完整地阅读我对午夜后时间设置不正确的回答。那么您应该知道为什么以下命令行可以替换整个发布的批处理文件代码。
@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
该命令行使用当前日期/时间将文件
Q:\Cdata\mm_tn\GETfn.csv
复制到目录 Q:\FTP\Sent
,并使用新文件名 GETfn_MMddyyyy-hhmm.csv
。
我不会使用此日期格式作为目标文件名。最好使用
GETfn_yyyyMMdd-hhmm.csv
,或者阅读GETfn_yyyy-MM-dd_hh-mm.csv
更好。这是国际日期格式,其最大优点是按名称排序的文件具有按时间顺序同时排序的这种日期/时间格式。这通常非常有帮助。所以我认为更好的是:
@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
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
copy /?
exit /?
for /?
if /?
robocopy /?