【问题标题】:batch file copy and move base on current month基于当前月份的批处理文件复制和移动
【发布时间】:2019-01-07 07:56:15
【问题描述】:

目前我有一个特定的批处理文件,我需要每个月运行一次。我想把它合并成一个bat文件。如果 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\"

【问题讨论】:

  • @catcat 目标文件夹已预先创建到 Jan-19、Feb-19 等
  • 好吧改变它。一个人适应容易的事情。
  • echo %Date:~10,4%%Date:~7,2%%Date:~4,2% 是人们实际所做的。
  • @CatCat echo %Date:~10,4%%Date:~7,2%%Date:~4,2% 不会为每个人提供相同的结果。系统日期因政策、位置、操作系统版本等而异。例如,我的会回显-0-0
  • 当然使用批处理意味着您需要考虑到地区差异。这就是为什么使用非编程语言,比如为用户批量使用计算机操作语言,是一个坏主意。我也不在美国,但那是编程语言的共同区域。这就是我编程的全部内容,colour(正确的英语)的拼写总是让我陷入困境 - 语言想要color

标签: batch-file copy scheduled-tasks move


【解决方案1】:

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

@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 要求的。

【讨论】:

  • 只是一个小小的观察......为什么你使用“奇怪的”set _01=Jan 符号来定义月份名称的数组?您也可以使用 standard set month[01]=Jan 更清晰的一个!恕我直言,初学者需要清晰而简单的答案,特别是在本质上不清楚的批处理文件的情况下......为什么在简单答案存在时插入额外的复杂性?我邀请您阅读this post...
  • 顺便说一句,copy "C:\TESTone\*.*" "C:\!_MM!-%YY%"in the description 错过了 MM 变量周围的百分号,尽管程序代码是正确的......
  • 我会这样初始化月份数组:set m=100 & for %%a in (Jan Feb ... Dec) do set /A "m+=1" & set "month[!m:~1!]=%%a"
【解决方案2】:

获取区域设置/用户设置独立日期的 wmic 替代方法是 powershell,
可以直接输出想要的格式:

:: 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,以选择特殊的偏差文化使用:

(Get-Date).ToString('MMM-yy',(New-Object System.Globalization.CultureInfo("en-us")))

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

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

【讨论】:

  • 出于好奇,您为什么总是在任务中使用 PowerShell?在这种情况下,既不请求也不拒绝。问题是,由于脚本将在每次用户登录后运行,因此由于 PowerShell 加载需要一些时间。我也认为代码不正确。输出很大程度上取决于语言设置。运行powershell -NoP -C "get-date -f 'MMM-yy'" 产生我Ιαν-19
  • 在这种情况下,locale independent 的措辞可能不吉利。但您通常会希望在您的语言环境中 使用月份名称。如果您需要一个不成问题的特定问题(Get-Date).ToString('MMM-yy',(New-Object System.Globalization.CultureInfo("en-us")))。我喜欢将批处理和 powershell 结合起来的原因只是我喜欢两者,PowerShell 在计算日期、文件编辑、选择和分组特别是对象方面有好处。 @双哔声
  • 好多了。你可以edit你的答案包括它。
  • @double-beep 只是想知道[globalization.cultureinfo]::GetCultures('allCultures')|sls 'gr'(Get-Date).ToString('MMM-yy',(New-Object System.Globalization.CultureInfo("el-GR")))
【解决方案3】:

根据您的区域设置,您可能需要稍微更改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

【讨论】:

  • 您还需要使用wmic,以使您的解决方案适用于所有人。例如对我来说,它不起作用。另外,%d% 变量在哪里定义?
  • @double-beep:很高兴知道!是的,您的解决方案更准确。我现在有一个新的提示。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 2011-01-13
  • 1970-01-01
  • 2019-01-15
  • 2010-10-29
  • 2014-11-12
相关资源
最近更新 更多