批处理文件复制并根据当前月份移动

时间:2019-01-07 07:56:16

标签: batch-file copy scheduled-tasks move

目前,我每个月都需要运行一个特定的批处理文件。我想将其合并为一个蝙蝠文件。如果2月1日使用2月19日,则有条件。

如果当前日期为2019年1月运行

copy "C:\TESTone\*.*" "C:\Jan-19"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\Jan-19\"

如果当前日期为2019年2月运行

copy "C:\TESTone\*.*" "C:\Feb-19"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\Feb-19\"

如果当前日期是2019年3月运行

copy "C:\TESTone\*.*" "C:\Mar-19"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\Mar-19\"

3 个答案:

答案 0 :(得分:2)

这是一个可能的解决方案:

@echo off

setlocal EnableDelayedExpansion

set month[01]=Jan
set month[02]=Feb
set month[03]=Mar
set month[04]=Apr
set month[05]=May
set month[06]=Jun
set month[07]=Jul
set month[08]=Aug
set month[09]=Sep
set month[10]=Oct
set month[11]=Nov
set month[12]=Dec

for /f "tokens=2 delims==" %%A in ('wmic OS Get localdatetime /value') do set "dt=%%A"
set "YY=%dt:~2,2%" & set "MM=%dt:~4,2%"

copy "C:\TESTone\*.*" "C:\!month[%MM%]!-%YY%"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\!month[%MM%]!-%YY%\"
pause
  • 在这里启用delayed expansion会有所帮助,因为我们在这里需要它,既不需要在代码块内使用,也不需要在一行中设置和使用变量时使用它。这将有所帮助,因为我们想回显一个值为另一个变量名称的变量。
  • 设置月份数组。我们使用表格varname[monthnum]
  • 要找到date,需要wmic,否则国际上是不一样的。 datetime环境变量由用户定义,它们通常取决于用户的区域设置。
  • 现在,将年份的最后两位数字存储在YY变量中,将月份的两位数字存储在MM变量中。
  • OP所需的命令是copy "C:\TESTone\*.*" "C:\MMM-YY"move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\MMM-YY\"。因此,YY就已经准备好了,我们有:
copy "C:\TESTone\*.*" "C:\MMM-%YY%"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\MMM-%YY%\"

MMM是变量month[MM]的值。因此,在这里使用延迟扩展;用!包装数字变量,用MM包装%。将会是:

copy "C:\TESTone\*.*" "C:\!month[%MM%]!-YY"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\!month[%MM%]!-YY\"

然后:

copy "C:\TESTone\*.*" "C:\!month[num]!-YY"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\!_num!-YY\"

然后进行处理,这实际上是OP的要求。

答案 1 :(得分:2)

使用Powershell替代wmic来获得与区域设置/用户设置无关的日期,
可以直接输出所需的格式:

:: Q:\Test\2019\01\07\SO_54070456.cmd
@Echo off
for /f "usebackq" %%A in (`powershell -NoP -C "get-date -f 'MMM-yy'"`) Do set "Month=%%A"
copy "C:\TESTone\*.*" "C:\%Month%"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\%Month%\"

这里是唯一回显的命令:

> Q:\Test\2019\01\07\SO_54070456.cmd
copy "C:\TESTone\*.*" "C:\Jan-19"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\Jan-19\"

PowerShell将返回当前文化的月份缩写MMM,以选择特殊的偏离文化用法:

  

(获取日期).ToString('MMM-yy',(新对象系统.Globalization.CultureInfo(“ en-us”)))

要找到一种文化,您可以使用.dot Net函数:

  

[globalization.cultureinfo] :: GetCultures('allCultures')

答案 2 :(得分:0)

根据您的区域设置,您可能需要稍微更改set destFolder=!month:~%d%,3!-%date:~8,2%上的一些参数,这是因为我插入了一个回显以首先在屏幕上向您显示正在发生的事情。最后也要停顿一下。调试完成后,您可以删除暂停:

@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1 delims=/" %%m in ("%date%") do (
   set /A "m=(1%%m%%100-1)*3"
)
set month=JanFebMarAprMayJunJulAugSepOctNovDec
set destFolder=!month:~%d%,3!-%date:~8,2%

set destFolder1=C:\%destFolder%\
echo copy "C:\TESTone\*.*" %destFolder1%
copy "C:\TESTone\*.*" %destFolder1%

set destFolder2=\\172.1.1.1\Shared-File\%destFolder%\
echo move "C:\TESTone\*.*" %destFolder2%
move "C:\TESTone\*.*" %destFolder2%

pause