所以我的任务是制作一个批处理文件,做一些特定的事情。我以前从来没有使用过batch,我发现很难找到关于我到底需要什么的教程。(我已经做了一些基本的教程)
我正在尝试从目录中获取最新编辑的文件。我想出的唯一一件事(我已经注意到其他人说要做的)是对目录中按日期排序的文件执行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.我对Batch是100%的新手。也许我做的事情真的很挑剔?(通过添加aa空间或类似的东西,人们已经解决了其他StackOverflow问题)
发布于 2013-07-19 00:57:24
您的条件永远不会满足,因为字符串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是否存在。
发布于 2013-07-19 09:02:50
如果您提供了准确的代码,那么您希望获得第一行-这是实现这一点的一种方法。
@echo off
FOR /f %%i in ('DIR Y:\ /B /O:-D') DO SET "NewestFile=%%i" & goto :done
:done
ECHO %NewestFile%发布于 2013-07-19 09:31:12
如果您将dir命令更改为按升序而不是降序列出文件,则可以使用这个一行程序,它不需要任何常见的奇怪的cmd.exe脚本技巧。它只保留了NewestFile变量中的最后一行输出(我猜它可能是cmd.exe脚本黑客,但我不认为它是奇怪的):
for /f %%i in ('DIR Y:\ /B /O:D') do set NewestFile=%%ihttps://stackoverflow.com/questions/17729592
复制相似问题