〜t返回空白而不是时间

时间:2019-04-24 07:42:04

标签: windows batch-file cmd

我正在尝试获取文件夹中最旧文件的名称和时间(按修改日期)。

使用此代码,我可以毫无问题地获得名字

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)

这是什么错误?我该如何解决?

非常感谢您的帮助

2 个答案:

答案 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,然后您将收到该文件的最后修改日期/时间。