Batch file 如何测试是否将新文件添加到目录并执行某些操作

Batch file 如何测试是否将新文件添加到目录并执行某些操作,batch-file,Batch File,我需要检查一个新的PDF文件是否被添加到一个目录中,然后我做一些事情 为此,我从以下批处理脚本开始: @echo off :loop IF exist "*.pdf" (for %%i in (*.pdf) do set pdfname_new=%%i) ELSE ( goto loop) ECHO %pdfname_new% goto loop 当我创建第一个PDF文件test1.PDF时,它工作正常,并打印test1 然后,当我添加test2.pdf时,它也可

我需要检查一个新的PDF文件是否被添加到一个目录中,然后我做一些事情

为此,我从以下批处理脚本开始:

@echo off

:loop
  IF exist "*.pdf" (for %%i in (*.pdf) do set pdfname_new=%%i) ELSE ( goto loop)
  ECHO %pdfname_new%
goto loop
当我创建第一个PDF文件test1.PDF时,它工作正常,并打印test1 然后,当我添加test2.pdf时,它也可以工作,并打印test2

当我添加test0.pdf时,它会打印test2

我注意到它不处理创建的最后一个pdf文件,但它也必须是按字母顺序排列的最后一个


即使创建的最后一个文件未按字母顺序排序,我如何处理它?

您可以使用
dir/o:-d使用最后修改的日期(最后修改的文件将是列表中的最后一个文件)

或者,如果您想使用Compo在注释中指定的
/t:c
来纯粹关注文件的创建日期/时间

@echo off
:loop
for /f "delims=" %%i in ('dir /b /o:d /t:c "*.pdf"') do set "file=%%~i"
echo "%file%"
timeout 5 /Nobreak >nul
goto :loop

对于/f“delims=“%%i in('dir/b/o:d*.pdf')do set“file=%%~i”>nul 2>&1
最后修改的文件应该是最后排序的文件,并且将是我们在变量
%file%
中设置的文件,因此该行后面的“echo”%file%”应该包含最新的文件。为了澄清,它从不打印
test2
,因为
%pdfname_new%
将始终解析为
test2.pdf
,(
set pdfname_new=%%~ni
将执行您实际发布为输出的操作。)。问题是您的输出没有按您希望的顺序排列。要解决这个问题,您需要确保您的命令根据需要迭代排序的文件。因为您提到了新文件,Gerhard认为日期顺序会更适合您的需要,并提供了解决方案。如果希望修改日期而不是按
进行排序
,请将
/T
选项与
C
A
一起使用。Windows命令处理器
cmd.exe
处理批处理文件不是为事件触发的任务而设计的。当前编写的循环占用处理器100%的一个核心,仅用于检查PDF文件是在目录中创建的还是复制到目录中的。所以这个解决方案是一个非常糟糕的解决方案。至少应添加命令
timeout
,以便在运行下一个文件检查之前等待几秒钟,从而为其他任务释放核心电源。最好使用存档属性,因为存档属性总是在目录中创建或修改的文件上自动设置。更好的代码示例:第一行
@echo off
,第二行
:Loop
,第三行
for/F“eol=| delims=“%%I in('dir”%~dp0*.pdf)/AA-D/B 2^>nul')执行%SystemRoot%\System32\attrib.exe-a“%~dp0%%I”和echo处理文件“%~dp0%%I”
,第四行
%SystemRoot%\System32\choice.exe/C EN/N/D N/T 5/M“使用键E退出批处理文件…”
,如果错误级别2转到循环,则执行第五行和最后一行
。命令DIR仅输出设置了存档属性的文件。在进一步处理文件之前,首先删除文件的存档属性,在本例中,这只是打印文件名。最后一行使用命令
choice
等待用户按键
E
,在这种情况下,批处理文件处理退出。否则,在五秒钟后选择选项
N
,导致再次运行FOR命令。命令选项不会在等待用户按键时打开CPU电源。因此,对于这个示例批处理文件,核心使用量是最小的。
@echo off
:loop
for /f "delims=" %%i in ('dir /b /o:d /t:c "*.pdf"') do set "file=%%~i"
echo "%file%"
timeout 5 /Nobreak >nul
goto :loop