所以我的任务是创建一个批处理文件来完成一些特定的事情。我之前从未使用过批处理,而且我发现很难找到关于我需要什么的教程。 (我已经完成了基础教程)
我正在尝试从目录中获取最新编辑的文件。我唯一想到的(我注意到其他人说要做的)是按日期排序的目录中的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问题已由人们解决,只需添加一个空格或类似的东西)
答案 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