【问题标题】:Open one of a series of files using a batch file使用批处理文件打开一系列文件中的一个
【发布时间】:2010-09-08 06:52:57
【问题描述】:

我有多达 4 个基于此结构的文件(注意前缀是日期)

  • 0830filename.txt
  • 0907文件名.txt
  • 0914filename.txt
  • 0921filename.txt

我想打开最近的一个(0921filename.txt)。如何在批处理文件中执行此操作?

谢谢。

【问题讨论】:

    标签: command-line batch-file dos cmd


    【解决方案1】:

    一个班轮,使用 EXIT 技巧:

    FOR /F %%I IN ('DIR *.TXT /B /O:-D') DO NOTEPAD %%I & EXIT
    

    编辑:

    @pam:你说得对,我假设文件按日期顺序排列,但你可以将命令更改为:

    FOR /F %%I IN ('DIR *.TXT /B /O:-N') DO NOTEPAD %%I & EXIT
    

    那么你就有了按名称倒序排列的文件列表。

    【讨论】:

      【解决方案2】:

      抱歉,我向这个问题发送了垃圾邮件,但我真的很想发布真正的答案。 如果您希望您的 BATCH 脚本解析比较文件名中的日期,那么您可以使用如下内容:

      @echo off
      
      rem Enter the ending of the filenames.
      rem Basically, you must specify everything that comes after the date.
      set fn_end=filename.txt
      
      rem Do not touch anything bellow this line.
      set max_month=00
      set max_day=00
      
      for /F %%i in ('dir /B *%fn_end%') do call :check "%%i"
      call :open %max_month% %max_day%
      exit /B 0
      
      :check
          set name=%~1
          set date=%name:~0,4%
          set month=%date:~0,2%
          set day=%date:~2,2%
          if /I %month% GTR %max_month% (
              set max_month=%month%
              set max_day=%day%
          ) else if /I %month% EQU %max_month% (
              set max_month=%month%
              if /I %day% GTR %max_day% (
                  set max_day=%day%
              )
          )
      exit /B 0
      
      :open
          set date=%~1
          set month=%~2
          set name=%date%%month%%fn_end%
          start "dummy" "%name%"
      exit /B 0
      

      【讨论】:

      • 我现在不喜欢,但如果那不好的话就该死!!
      • 男人!你知道有什么好书可以学习写这样的东西吗?!
      • 你也可以回答这个问题! beta.stackoverflow.com/questions/51054/…
      • 其实,书本是没有必要的。您可以简单地在命令行中键入 HELP,以获取所有默认命令的列表。然后您可以阅读每个单独命令的帮助以获取更多信息 - 您只需添加 /?切换到命令。或者至少,我就是这样做的。
      • 我不知道 SET 可以做子字符串。这对我帮助很大。谢谢!
      【解决方案3】:

      给你...(希望没有人能打败我...)(您需要将文件另存为 lasttext.bat 或其他文件) 这将打开/运行最旧的 .txt 文件

      dir *.txt /b /od > systext.bak 
      FOR /F %%i in (systext.bak) do set sysRunCommand=%%i 
      call %sysRunCommand%
      del systext.bak /Y
      

      可能只有 XP。看看 DOS 的强大威力。
      虽然这会按日期获取最新的文件名 - 而不是按文件名..

      如果您想获取最新的文件名,请将 /od 更改为 /on 。
      如果要对其他内容进行排序,请在第二行添加“排序”命令。

      【讨论】:

      • 您的方法可以使用,但会创建不必要的临时文件。另外,当在 BATCH 脚本中使用 del 时,我总是添加 /Y 开关 - 否则 del 命令会很烦人... :)
      【解决方案4】:

      此方法使用实际的文件修改日期,来判断哪个是最新的文件:

      @echo off
      for /F %%i in ('dir /B /O:-D *.txt') do (
          call :open "%%i"
          exit /B 0
      )
      :open
          start "dummy" "%~1"
      exit /B 0
      

      但是,此方法按字母顺序选择最后一个文件(或第一个,按字母倒序),因此如果文件名一致 - 它会起作用:

      @echo off
      for /F %%i in ('dir /B *.txt^|sort /R') do (
          call :open "%%i"
          exit /B 0
      )
      :open
          start "dummy" "%~1"
      exit /B 0
      

      您实际上必须选择哪种方法更适合您。

      【讨论】:

      • 你能告诉我 %%i 在第 2 行中的作用以及 %~1 在第 7 行中的作用吗?谢谢!
      • %%i 是循环变量(它将获取括号内的命令写入标准输出的每一行中第一个单词的值)。 %1 是一种访问传递给脚本或标签的命令行参数的简单方法(就像我的例子一样)。但是,%~1 会删除引号(如果有的话)。
      • 立陶宛维尔纽斯...?....嗯...我认识那里的程序员...Gintaras Didzgalvis,他制作了QuickMacros (QuickMacros.com)。你应该找个时间看看他。
      • 只是想说我每次启动计算机时都使用上面的解决方案打开了我最新的待办文本文件!感谢您的帮助!
      【解决方案5】:

      使用正则表达式解析出相关整数并进行比较。

      【讨论】:

      • 我认为这个问题暗示了他只想使用可以从命令行获得的东西。你知道 Windows 上可以使用的命令行 RE 工具吗?
      猜你喜欢
      • 2018-12-31
      • 2015-01-24
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      相关资源
      最近更新 更多