批处理ECHO%varname%只是说“Echo is on”。

时间:2013-07-18 16:54:26

标签: windows for-loop batch-file echo

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

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

一些问题: 1)我的循环永不休息 2)我的ECHO%变量%在最后不起作用。

@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.

我是批处理的100%新手。也许我正在做一些非常挑剔的事情? (其他StackOverflow问题已由人们解决,只需添加一个空格或类似的东西)

3 个答案:

答案 0 :(得分:1)

您的情况永远不会得到满足,因为字符串count永远不会等于字符串0。你需要

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

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

setlocal enabledelayedexpansion

这里的问题是你需要告诉批处理文件有一个变量。与Perl中的foo一样,您不会神奇地解析批处理文件中$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是否存在。

答案 1 :(得分:0)

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

@echo off
FOR /f %%i in ('DIR Y:\ /B /O:-D') DO SET "NewestFile=%%i" & goto :done
:done
ECHO %NewestFile%

答案 2 :(得分:0)

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

for /f %%i in ('DIR Y:\ /B /O:D') do set NewestFile=%%i