1

所以我的任务是制作一个做一些特定事情的批处理文件。我以前从未使用过批处理,而且我发现很难找到关于我到底需要什么的教程。(我已经完成了基础教程)

我正在尝试从目录中获取当前编辑最多的文件。我想出的唯一一件事(我注意到其他人说这样做)是按日期排序的目录中的文件的 for 循环,然后只获取第一个文件并打破循环。

一些问题:1)我的循环永远不会中断 2)我的 ECHO %variable% 最后不起作用。

@echo off
SET count=0
FOR /f %%i in ('DIR Y:\ /B /O:-D') DO (
IF count==0 (
SET NewestFile=%%i
SET count=1
)
)
@echo on
ECHO %NewestFile%

当我运行它时,我得到:

C:\>testing.bat
C:\>ECHO
ECHO is on.

我是 Batch 的 100% 新手。也许我正在做一些这真的很挑剔的事情?(其他 StackOverflow 问题已通过添加空格或类似内容的人解决)

4

3 回答 3

1

您的条件永远不会满足,因为 stringcount永远不会等于 string 0。你需要

if !count!==0 (
  set NewestFile=%%i
  set count=1
)

但是您还需要延迟扩展(在批处理文件的开头):

setlocal enabledelayedexpansion

这里的问题是你需要告诉批处理文件有一个变量。就像foo在 Perl 中一样,不会神奇地解析批处理文件中变量的$foo内容count不等于%count%(变量内容)或!count!(相同,但扩展延迟)。

延迟扩展是必要的,因为整个for循环是一次解析的。并在解析期间用它们的内容cmd替换普通 ( %foo%) 变量,以便在执行期间只保留值。因此,一旦执行到达,if就会出现条件0==0,因为这就是count循环之前的值。延迟扩展(使用!foo!语法)在执行之前立即扩展变量,因此不会发生这种情况。

有关延迟扩展的更多帮助,您可以阅读help set

另一种方法是只使用count变量的缺失或存在:

SET count=
FOR /f %%i in ('DIR Y:\ /B /O:-D') DO (
  IF not defined count (
    SET NewestFile=%%i
    SET count=1
  )
)

这可以解决上述问题,因为在解析期间没有要替换的变量。我们所做的只是运行时检查变量是否count存在。

于 2013-07-18T16:57:23.913 回答
0

如果您提供了准确的代码,那么您希望获得第一行 - 这是一种方法。

@echo off
FOR /f %%i in ('DIR Y:\ /B /O:-D') DO SET "NewestFile=%%i" & goto :done
:done
ECHO %NewestFile%
于 2013-07-19T01:02:49.513 回答
0

如果您将dir命令更改为按升序而不是降序列出文件,则可以使用这种不需要任何常见奇怪的 cmd.exe 脚本黑客的单行程序。它只是将最后一行输出保留在NewestFile变量中(我猜它可能符合 cmd.exe 脚本黑客的条件,但我认为它不符合奇怪的条件):

for /f %%i in ('DIR Y:\ /B /O:D') do set NewestFile=%%i
于 2013-07-19T01:31:11.727 回答