命令行中的变量重置

时间:2015-12-30 12:50:07

标签: cmd

我的要求是根据上次修改日期在文件夹中查找最新文件名。  我需要单行命令。我在命令下执行。

@echo off && (for /f "tokens=*" %a in ('dir /b/a-d/od/t:w *.*') do set newestfile=%a) && @echo on && echo %newestfile%

这给了我正确的结果,但唯一的问题是,如果我修改另一个文件...那么它也显示我以前的文件名。我已经读过,本地变量没有被重置,这就是显示旧/上一个文件的原因。

我在批处理脚本中编写了逻辑。这是按照预期的方式工作但在命令行中给了我奇怪的结果。

2 个答案:

答案 0 :(得分:2)

这是一个更简单的解决方案,可以避免使用任何环境变量。

只需反转排序顺序,首先列出最新文件,然后终止循环。这可以通过启动运行处理DIR命令的FOR / F循环的新cmd.exe进程来完成。循环回显第一个列出的文件,然后退出该过程。我相信这是最简单和最有效的方法。

cmd /d /c for /f "eol=: delims=" %a in ('dir /b/a-d/o-d/t:w') do @echo %a^&exit

可以使用没有延迟扩展的变量 - 如果DEFINED不需要延迟扩展。

set go=1&for /f "eol=: delims=" %a in ('dir /b/a-d/o-d/t:w') do @if defined go echo %a&set "go="

您可以使用FINDSTR获取第一个列出的文件。如果您不关心1:前缀,可以使用:

dir /b/a-d/o-d/t:w | findstr /n "^" | findstr "^1:"

如果要删除前缀,只需使用FOR / F循环进行处理:

for /f "delims=: tokens=1*" %a in ('dir /b/a-d/o-d/t:w ^| findstr /n "^" ^| findstr "^1:"') do @echo %b

答案 1 :(得分:0)

为此你需要delayed expansion。由于这是从命令行调用的,因此您需要一个带有cmd /v:on /c "(for /f "tokens=*" %a in ('dir /b/a-d/od/t:w *.*') do @set newestfile=%a) && @echo !newestfile!" 参数的新cmd实例:

<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["C:\\The\\Path\\To\\Subreport\\"]]></defaultValueExpression>
</parameter>