Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/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
Cmd 使用Windows批处理列出比其他文件更新的文件_Cmd - Fatal编程技术网

Cmd 使用Windows批处理列出比其他文件更新的文件

Cmd 使用Windows批处理列出比其他文件更新的文件,cmd,Cmd,列出目录中文件的名称。如何仅列出比指定文件(例如foo.txt)更新的文件?此批处理文件可用于此任务: dir /b 批处理文件的执行在名为 无参数的或 参数字符串为而不是现有文件/目录或 使用参数字符串,该字符串是现有目录而不是文件 FOR的命令在后台以cmd.exe/C启动的单独命令过程中执行命令DIR DIR逐行输出 只是文件,因为/A-D(属性不是目录) 仅由于/B 按上次修改/写入日期反向订购,这意味着最新文件在第一位,最旧文件在最后一位,因为/O-D 所有文件,包括指定文件

列出目录中文件的名称。如何仅列出比指定文件(例如foo.txt)更新的文件?

此批处理文件可用于此任务:

dir /b 
批处理文件的执行在名为

  • 无参数的或
  • 参数字符串为而不是现有文件/目录或
  • 使用参数字符串,该字符串是现有目录而不是文件
FOR的命令在后台以
cmd.exe/C
启动的单独命令过程中执行命令DIR

DIR逐行输出

  • 只是文件,因为
    /A-D
    (属性不是目录)
  • 仅由于
    /B
  • 按上次修改/写入日期反向订购,这意味着最新文件在第一位,最旧文件在最后一位,因为
    /O-D
  • 所有文件,包括指定文件目录中的隐藏文件
FOR捕获为处理已启动的后台命令进程的STDOUT而写入的所有内容,然后逐行处理捕获的行,跳过此处不存在的空行

FOR默认情况下忽略以分号开头的行。文件名可以以
开头。因此,使用默认值中的选项
eol=|
重新定义行尾字符到垂直条
|
,因为此字符不能用于文件名

FOR默认情况下,使用空格和制表符作为分隔符将每行拆分为子字符串,并仅将第一个空格/制表符分隔的字符串指定给指定的循环变量
I
。因此,使用选项
delims=
将分隔符列表重新定义为空的分隔符列表,从而禁用行拆分以处理包含一个或多个空格的正确文件名

DIR输出按日期从最新到最旧排序的文件名。因此,在FOR循环中,使用不区分大小写的字符串比较来检查当前文件名是否等于指定的文件名。如果此条件变为真,则跳转到循环下方的标签,退出循环。否则,当前文件名将输出到控制台

最后,批处理文件暂停批处理文件的执行,以便在启动批处理文件的情况下通过双击它来读取列表

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
    。。。解释批处理文件参数引用
  • dir/?
  • echo/?
  • 获取/?
  • goto/?
  • 如果/?
  • 暂停/?
注意:如果一个或多个文件具有与指定文件完全相同的最后修改日期,则无法预测这些文件中的哪些文件也是由此代码输出的。如果要排除与指定文件具有相同文件日期的文件,还需要一个条件。以下IF条件可用于在FOR循环的主体中存在IF条件之后退出日期/时间相同的文件上的循环

@echo off
if "%~1" == "" goto :EOF
if not exist "%~1" goto :EOF
if exist "%~1\" goto :EOF

echo Files newer than %~nx1 in directory: %~dp1
echo/

for /F "eol=| delims=" %%I in ('dir "%~dp1" /A-D /B /O-D') do (
    if /I "%~nx1" == "%%I" goto ExitLoop
    echo %%I
)

:ExitLoop
echo/
pause

但此IF条件只比较文件日期/时间,而不比较秒数。因此,如果当前文件具有相同的日期、小时和分钟,但秒值更高,因此也比指定的文件(以秒为单位,Windows命令处理器不使用此代码)实际更新,则它也会导致退出循环。

如果您愿意使用PowerShell,这非常容易。它在.ps1脚本中使用时不那么麻烦,但可以在.bat文件脚本中完成

for %%J in ("%~dp1%%I") do if "%%~tJ" == "%~t1" goto ExitLoop
如果知道要用作起点的日期,可以将其放入命令中

SET "SEARCHDIR=C:\src\t"
SET "REFFILE=C:\src\t\truename.bat"

powershell -NoProfile -Command ^
    "Get-ChildItem -File -Path "%SEARCHDIR%" |" ^
        "Where-Object -FilterScript { $_.LastWriteTime -ge (Get-ChildItem -Path %REFFILE%).LastWriteTime }"

你有足够的分数来了解它是如何工作的。显示您的代码,这里的人非常有帮助。如果您没有任何代码,需要雇佣程序员,请尝试
powershell -NoProfile -Command ^
    "Get-ChildItem -File -Path "%SEARCHDIR%" |" ^
        "Where-Object -FilterScript { $_.LastWriteTime -ge '2018-08-14' }"