首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理ECHO %varname%只是说"Echo is on“。

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

Stack Overflow用户
提问于 2013-07-19 00:54:26
回答 3查看 3.2K关注 0票数 1

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

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

一些问题: 1)我的循环永远不会中断2)我的ECHO %变量在结束时不工作。

代码语言:javascript
复制
@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%

当我运行这段代码时,我得到:

代码语言:javascript
复制
C:\>testing.bat
C:\>ECHO
ECHO is on.

我对Batch是100%的新手。也许我做的事情真的很挑剔?(通过添加aa空间或类似的东西,人们已经解决了其他StackOverflow问题)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-19 00:57:24

您的条件永远不会满足,因为字符串count永远不会等于字符串0。你需要

代码语言:javascript
复制
if !count!==0 (
  set NewestFile=%%i
  set count=1
)

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

代码语言:javascript
复制
setlocal enabledelayedexpansion

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

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

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

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

代码语言:javascript
复制
SET count=
FOR /f %%i in ('DIR Y:\ /B /O:-D') DO (
  IF not defined count (
    SET NewestFile=%%i
    SET count=1
  )
)

这解决了上面的问题,因为在解析过程中没有要替换的变量。我们要做的就是在运行时检查变量count是否存在。

票数 1
EN

Stack Overflow用户

发布于 2013-07-19 09:02:50

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

代码语言:javascript
复制
@echo off
FOR /f %%i in ('DIR Y:\ /B /O:-D') DO SET "NewestFile=%%i" & goto :done
:done
ECHO %NewestFile%
票数 0
EN

Stack Overflow用户

发布于 2013-07-19 09:31:12

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

代码语言:javascript
复制
for /f %%i in ('DIR Y:\ /B /O:D') do set NewestFile=%%i
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17729592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档