【问题标题】:Batch file: check name of day date, trim and copy批处理文件:检查日期名称,修剪和复制
【发布时间】:2015-07-24 07:04:47
【问题描述】:
我正在寻找用于检查文件夹中文件的 Windows CMD 批处理脚本。文件夹中的文件命名为:
20150724_XXXXX.mp3
如您所见,文件以日期开头,格式为:YYYYMMDD(其中XXXXX 将是一个名称)。
当批处理文件找到一个以实际日期开始的文件时,该文件将被复制到另一个文件夹。然后从文件中删除文件名中的日期,仅保留XXXXX.mp3。
【问题讨论】:
-
类似的问题还有很多,你试过搜索batch date file copy吗?这是example。在 SO 上,您必须明确说明为什么类似的解决方案不适用,除非您希望您的问题作为重复项被关闭。
标签:
windows
batch-file
cmd
copy
【解决方案1】:
为MP3_FOLDER 和DESTINATION 设置正确的位置,然后试试这个:
@echo off
setlocal enableDelayedExpansion
:::::::::::::::::::::::::
set MP3_FOLDER=c:\mp3
set DESTINATION=c:\mp3_no_date
:::::::::::::::::::::::::
pushd "%temp%"
makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
set "current-date=%%e-%%b-%%c"
set "YYYY=%%e"
set "MMM=%%b"
set "DD=%%c"
set "current-time=%%d"
set "weekday=%%a"
)
del ~.*
popd
set "Jan=01"
set "Feb=02"
set "Mar=03"
set "Apr=04"
set "May=05"
set "Jun=06"
set "Jul=07"
set "Aug=08"
set "Sep=09"
set "Oct=10"
set "Nov=11"
set "Dec=12"
set "MMM=!%MMM%!"
echo YYYYMMDD: %YYYY%%MMM%%DD%
set "YYYYMMDD=%YYYY%%MMM%%DD%"
pushd %MP3_FOLDER%
for %%# in (%YYYYMMDD%_*) do (
set "fname=%%~nx#"
set fname=!fname:~9!
copy /y "%%~f#" "%DESTINATION%\!fname!"
)
popd
endlocal
pause
【解决方案2】:
试试下面的脚本。当然,您需要根据自己的需要对其进行调整,但它应该可以帮助您入门:
setlocal enabledelayedexpansion
set mask=%date:~6,4%%date:~3,2%%date:~0,2%*
for %%i in (%mask%) do (
set name=%%i
set shortname=!name:~9!
echo !shortname!
)
首先定义搜索的掩码。如果您的本地日期显示不同(我的是 24.07.2015),您需要调整此行
for 循环枚举所有匹配掩码的文件
因为您要删除日期信息,您必须首先将 for 变量分配给环境变量,然后删除前 9 个字符。请注意,您不能直接从 for 变量执行此操作,并且如果没有 enabledelayedexpansion 设置,您将无法访问 for 循环内的环境变量。
【解决方案3】:
您可以使用wmic 命令以标准化格式获取当前系统日期,如下所示:
@echo off
setlocal EnableDelayedExpansion
rem set source and destination directories to your needs
set sourcedir=C:\source
set destindir=C:\destin
rem get locale-independent date/time string (YYYYMMDDHHMMSS...) by "WMIC" command;
for /F "tokens=2 delims==" %%I in ('wmic OS GET LocalDateTime /VALUE') do set DAT=%%I
rem find files with today's date in name;
pushd %sourcedir%
for %%F in ("%DAT:~0,8%_*.mp3") do (
set NAM=%%~F
rem remove /L to go life (/L just lists what would be copied);
REM xcopy /L "%%~F" "%destindir%\!NAM:~9!"
)
popd
endlocal
删除/L 开关以实际复制,而不仅仅是列出要复制的内容。