【问题标题】: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_FOLDERDESTINATION 设置正确的位置,然后试试这个:

@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 开关以实际复制,而不仅仅是列出要复制的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多