Windows命令行复制文件:如何给10点前的小时补前导零?
解决Windows CMD复制文件时时间前导零缺失的问题
我懂你遇到的这个糟心问题——上午10点前跑备份命令,文件名里的小时位居然是空格,导致文件名看起来乱糟糟的。先给你拆解下原命令的格式化逻辑,再给你几个好用的解决方案。
原命令的问题根源
你用的%date%和%time%是CMD自带的环境变量,它们的输出格式跟着系统区域设置走:
%date:~-4,4%:取日期字符串最后4位(也就是年份,比如2018)%date:~-10,2%:从倒数第10位开始取2位(月份,比如05)%date:~-7,2%:从倒数第7位开始取2位(日期,比如09)%time:~0,2%:取时间字符串前2位(小时)
但上午10点前,%time%的输出是类似 9:50:00.00的格式——小时位是空格+单个数字,直接截取前2位就会得到 9,拼接后自然就出现了_ 950的问题。
解决方案1:CMD环境变量替换(推荐)
我们可以先把时间里的空格替换成0,再做截取,这样就能自动补上前导零。完整命令如下:
@echo off :: 把当前时间存入临时变量 set "current_time=%time%" :: 将时间里的所有空格替换为0 set "formatted_time=%current_time: =0%" :: 执行复制,用处理后的时间生成规范文件名 copy "M:\Production Schedule.xlsm" "m:\gsdBackups\ProductionSchedule%date:~-4,4%%date:~-10,2%%date:~-7,2%_%formatted_time:~0,2%%formatted_time:~3,2%%formatted_time:~6,2%.xlsm"
执行后,9:50生成的文件名就会变成ProductionSchedule20180509_0950.xlsm(如果不需要秒数,把%formatted_time:~6,2%删掉就行)。
要是想写成一行命令(可读性稍弱,但快捷),可以直接嵌套替换:
copy "M:\Production Schedule.xlsm" "m:\gsdBackups\ProductionSchedule%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time: =0:~0,2%%time: =0:~3,2%%time: =0:~6,2%.xlsm"
解决方案2:用PowerShell更省心
如果你的系统支持PowerShell,用它处理日期时间会更靠谱(不受区域设置干扰),代码也简洁很多:
# 生成格式化时间戳:年-月-日_时-分-秒 $timestamp = Get-Date -Format "yyyyMMdd_HHmmss" # 执行文件复制 Copy-Item "M:\Production Schedule.xlsm" "m:\gsdBackups\ProductionSchedule$timestamp.xlsm"
这个方法不管是上午9点还是晚上22点,都会自动补全前导零,完全不用手动处理空格的问题。
内容的提问来源于stack exchange,提问作者Stephen McElduff
相关产品推荐
相关产品推荐

