我正在尝试获取文件夹中最旧文件的名称和时间(按修改日期)。
使用此代码,我可以毫无问题地获得名字
for /f "delims=" %%x in ('dir /b /o-d /a-d %currentfolder% ^| grep -v / ') do (SET FILEINFO=%%x )
据我了解,将%% x换成%%〜tx应该返回修改后的时间而不是文件名。但是我却空白了。
for /f "delims=" %%x in ('dir /b /o-d /a-d %currentfolder% ^| grep -v / ') do (SET FILEINFO=%%~tx )
以下代码返回文件夹中文件的时间,但不是最旧的文件。
for %%a in (%currentfolder%\*) do (set LAST_TIME=%%~ta)
我尝试结合第一个和最后一个代码来获取最早文件的时间,但它也返回一个空白。
for %%b in (%currentfolder%\%FILEINFO%) do (set MAXDATE=%%~tb)
这是什么错误?我该如何解决?
非常感谢您的帮助
答案 0 :(得分:1)
您快到了:
@echo off
set "currentfolder=D:\some directory\"
pushd "%directory%"
for /f "delims=" %%i in ('dir /b /a-d /od') do (
set "file=%%i"
set "moddate=%%~ti"
goto :done
)
popd
:done
echo %file% %moddate%
因此,我们按日期排序(最旧的最早),然后将第一个文件名设置为%file%
,其日期为%moddate%
,然后退出循环,因此它不会对文件中的其他文件执行相同的操作。文件夹。
答案 1 :(得分:0)
该问题是由于以下事实引起的:for /F
所引用的当前工作目录与dir
所在其中搜索文件的目录不同。
可以这样解决(省略grep
,因为我在这里不了解其目的):
rem // Temporarily change to the directory containing the files of interest:
pushd "%currentfolder%"
rem /* The current working directory is now the target directory;
rem thus both `dir` and `for /F` work in the same directory: */
for /F "delims=" %%x in ('dir /B /A:-D /O:-D') do (set "FILEINFO=%%~tx")
rem // Restore the former working directory:
popd
rem // Just output the gathered information:
echo/%FILEINFO%
或者,pushd
删除后,cd /D "%currentfolder%"
命令行可以替换为popd
,因为您不需要还原原始工作目录。
要了解原始代码中发生了什么,让我们假设:
C:\TEST
; currentfolder
的内容为D:\DATA
; C:\TEST
仅包含批处理文件; D:\DATA
包含一个名为some.txt
的文件; 命令行dir /b /o-d /a-d %currentfolder%
仅返回纯文件名(由于其选项/B
),因此基于预定义的样本数据,输出为:
some.txt
现在,此文本由for /F
循环捕获。现在,%%~tx
查询最后的修改日期/时间,这当然需要访问文件系统。请记住,当前工作目录为C:\TEST
,因此for /F
循环尝试从以下文件中收集信息:
C:\TEST\some.txt
由于此类文件不存在,因此输出为空白。
要证明这一点,只需将一个新文件some.txt
放入目录C:\TEST
,然后您将收到该文件的最后修改日期/时间。