Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 获取最近文件的最后修改日期(递归),并将该日期添加到文件夹名称中_Batch File_Cmd_Rename_Last Modified - Fatal编程技术网

Batch file 获取最近文件的最后修改日期(递归),并将该日期添加到文件夹名称中

Batch file 获取最近文件的最后修改日期(递归),并将该日期添加到文件夹名称中,batch-file,cmd,rename,last-modified,Batch File,Cmd,Rename,Last Modified,我有一个包含子文件夹和多个文件的文件夹 Root\Mainfolder1\Subfolder1\files Root\Mainfolder1\Subfolder1\Subfolder2\files 根目录\Mainfolder1\Subfolder3\files Root\Mainfolder2\files Root\Mainfolder2\Subfolder1\files 批处理文件在rootdir中 我需要获取所有文件夹中最新文件的最后修改日期(yyyymmdd)。 获取日期后,我需要将

我有一个包含子文件夹和多个文件的文件夹

  • Root\Mainfolder1\Subfolder1\files
  • Root\Mainfolder1\Subfolder1\Subfolder2\files
  • 根目录\Mainfolder1\Subfolder3\files
  • Root\Mainfolder2\files
  • Root\Mainfolder2\Subfolder1\files
批处理文件在rootdir中

我需要获取所有文件夹中最新文件的最后修改日期(yyyymmdd)。 获取日期后,我需要将日期添加到mainfolders名称中,如: “主文件夹(yyyymmdd)”

之后,我需要为下一个主文件夹相同。基本上,我会得到这样的结果:

Root\Mainfolder1 (yyyymmdd)
Root\Mainfolder2 (yyyymmdd)
Root\Mainfolder3 (yyyymmdd)
附加信息:我的系统有另一种日期格式:dd.mm.yyyy(但我需要上述格式)

我希望这是一个批处理文件,我可以把它放在根目录中,然后执行它来完成我上面解释的工作。 到目前为止我有什么代码?几乎什么都没有。没有可用的。我发现的唯一一件事是如何列出所有修改日期(但它们没有排序或任何东西),如下所示:

dir /s /O:D /T:W /A:-D
我无法通过搜索功能找到任何东西
欢迎提出任何建议,谢谢:)

尝试一下。我在代码中添加了一些注释,以帮助您理解正在发生的事情。当您对输出感到满意时,删除
RENAME
命令前面的
ECHO

@echo off
setlocal enabledelayedexpansion

REM List the directories first
FOR /F "delims=" %%G IN ('dir /ad /b') DO (
    rem Change to the directory
    pushd "%%G"
    set "dt="
    set "newest="
    REM Get the date and time from the newest file from the folder.
    FOR /F "delims=" %%H IN ('dir /S /a-d /b 2^>nul') DO (
        REM by default the ~t modifier uses modified date and time
        SET "dt=%%~tH"
        REM Now split up the date into a usable format.
        REM Change the delims option to the separator your date format uses.
        REM also need a space because the time follows the date 
        FOR /F "tokens=1-3 delims=/. " %%I IN ("!dt!") DO (
            set "dt=%%K%%J%%I"
        )
        IF NOT DEFINED newest IF defined dt set "newest=!dt!" 
        IF DEFINED newest IF defined dt IF !dt! GTR !newest! set "newest=!dt!" 
    )
    POPD
    IF DEFINED newest echo rename "%%~G" "%%G(!newest!)"
)

如果输出看起来正确,请删除最后一行中的
ECHO
部分。

这是一个批处理文件,用于确定给定目录树中的最新修改日期;这取决于本地日期格式设置,不幸的是:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_ROOT=%~1”&rem//(将第一个命令行参数作为根目录。)
rem//定义本地日期格式的子字符串部分——请参见“日期/T”:
设置“_Y=0,4”&rem//(年份:从零开始的字符索引,字符数长度。)
设置“_M=5,2”&rem//(月份:从零开始的字符索引,字符数长度。)
设置“_D=8,2”&rem//(日期:从零开始的字符索引,以字符数表示的长度。)
rem//确保`\u ROOT`不为空:
如果未定义_根集“_根=”
设置“LAST=00000000”
对于/F“delims=eol=|”%%D in('echo“%\u ROOT%”^&dir/B/S/A:D“%\u ROOT%”2^>nul'),请执行以下操作:(
调用:获取最后一个文件“%%~D”&&(
调用:GETDATE文件“%%FILE%%”
setlocal EnableDelayedExpansion
如果!最后!LSS!文件(
端部
调用集“LAST=%%FILE%%”
)否则(
端部
)
)
)
rem//返回整个目录树中的最终修改日期:
回音(%LAST%)
端部
退出/B
:GETLAST rtn_path val_dir
::获取给定目录中最后修改的文件。
::参数:
::rtn_path变量,用于接收上次修改文件的路径;
::val_dir目录路径,用于在中搜索上次修改的文件;
::ERRORLEVEL:如果未找到文件,则为1,否则为0;
setlocal DisableDelayedExpansion
设置“#RTN=%~1”
设置“项=%~2”
(对于/F“delims=eol=|”%%F in('dir/B/A:-D/T:W/O:-D”%ITEM%\*.*“2^>num”)是否执行(
设置“ITEM=%ITEM%\%%F”
(呼叫)&转到:退出
))| |设置“项目=”
:退出
endlocal&设置“%#RTN%=%ITEM%”
退出/B
:GETDATE rtn_date val_路径
::获取文件/dir的最后修改日期,格式正确,如“YYYYMMDD”。
::参数:
::rtn_date变量,用于接收格式化日期;
::val_获取的上次修改日期的路径;
setlocal DisableDelayedExpansion
设置“#RTN=%~1”
设置“项=%~t2”
setlocal EnableDelayedExpansion
设置“项目=!项目:~%\u Y%!!项目:~%\u M%!!项目:~%\u D%!”
endlocal&endlocal&设置“%#RTN%=%ITEM%”
退出/B

Squashman,非常感谢。它非常接近我所需要的。唯一的问题是它不会递归检查文件。它只查找主文件夹中的文件,而不查找子文件夹。Root\Mainfolder1\Subfolder1\file等,我如何更改代码,以便也通过主文件夹中的子文件夹查找所有文件?实际上我不知道需要在这里添加/s“('dir/s/a-d/b/od')DO('@tartaro在这种情况下,/S将不起作用。使用/S选项时,它将按日期顺序列出每个目录。它不会按日期顺序列出整个树。@tartaro,您必须从每个文件中获取日期,并将其与上一个文件进行比较,以查看其是否较新。唯一的方法是将日期按yyyymmdd顺序排列。在编辑附加日期现在已更改为(hh:mmdd.mm.yyyy),在编辑之前,格式已经正确。我唯一的问题是,如果主文件夹包含子文件夹,则当前不考虑子文件夹中的文件。批处理仅适用于直接位于主文件夹中的文件,而不适用于其子文件夹。您有解决方案吗?谢谢far@tartaro StackOverFlow不是一个代码编写服务。我已经比其他人走得更远了。大多数时候,像你这样的帖子都会被关闭。我已经给了你基本代码,并告诉你从这里开始需要做什么来更改它。关于你的日期不同,请阅读我在代码中的注释!我必须用e delimiter my DATE格式使用!很高兴你解释了你想要输出的样子,但有时你也需要显示输入内容的图片。如果你说在这个文件夹结构中查找最新的文件
Root\Mainfolder1\subfolder1\subfolder2
,我会更清楚。你完全是我很抱歉,我没有给出一个很好的输入示例。您给出的示例是正确的。Root\Mainfolder1\Subfolder1\Subfolder2\files等,文件的级别可能因文件夹而异。我猜您的意思是
/O:D
而不是
/O@echo off
setlocal EnableDelayedExpansion

rem Process all folders in current dir
for /F "delims=" %%a in ('dir /B /A:D') do (

   rem Get the dates of all files in this folder and keep the most recent one
   cd "%%a"
   set "recent=0"
   for /F "tokens=1-3 delims=/. " %%d in ('dir /S /T:W /A:-D ^| findstr "^..\."') do (
      if %%f%%e%%d gtr !recent! set "recent=%%f%%e%%d"
   )

   rem Rename this folder
   cd ..
   ECHO ren "%%a" "%%a (!recent!)"

)