【问题标题】:Use contents of file as two separate variables使用文件的内容作为两个单独的变量
【发布时间】:2014-07-06 22:04:02
【问题描述】:

我需要做两件事......

  1. 重命名目录中的所有文本文件。每个文件都用一个单词和一个数字命名,它们之间有一个空格。我想从文件名中删除数字。

    例如....

     House 21.txt -> House.txt
    
  2. 上述每个文件的内容与其名称相同。它们每个都有一个单词和一个数字,它们之间有一个空格。我需要能够获取单词和数字并将它们保存为单独的变量。

    例如:

     Car 2     -> Set var1=Car & var2=2
    

当内容没有相同数量的字符时,我只是不知道从文件中删除适当信息的正确方法。如果我只需要删除最后 5 个字符,我可以这样做:

@echo off
setlocal enabledelayedexpansion
for %%a in (*.TXT) do (
   set oldName=%%a
   set newName=!oldName:~0,-5!
   echo !newName!>!newName!.txt
)

但每个文件的长度不同,仅删除 5 个字符对于需要 6 个或更多字符的文件不起作用。谁能指出我正确的方向?

【问题讨论】:

    标签: loops batch-file for-loop rename


    【解决方案1】:

    一种方法:

    @echo off
    
    setlocal enabledelayedexpansion
    
    for %%a in (*.txt) do call:treat "%%~na"
    exit/b
    
    :treat
    set count=1
    for %%b in (%~1) do (
           set $var!count!=%%b
          set /a count+=1)
    
    echo !$var1! - !$var2!
    echo ren "%~1%.txt" !$var1!.txt
    
    pause
    

    这将在每次迭代中创建$var1$var2,然后您可以将%1 重命名为!$var1!

    如果输出对您来说是正确的,只需删除回声。

    【讨论】:

    • 非常感谢!这似乎是为文件夹中的第一个 .txt 做的。如何让它遍历文件夹中的所有 .txt 文件?我可以添加索引器吗?
    • 这将对每个.txtfile 执行此操作。只需删除暂停。
    • 如果我遗漏了什么,我很抱歉,但即使删除了暂停,它也会继续我的其余代码。仅编辑第一个 .txt 文件。我一定错过了什么,我会继续寻找。
    • goto :eof 替换pause 告诉它call 已经完成并且它必须“返回”。如果您有更多代码要执行,请将exit /b 替换为goto continue 并在(新)goto :eof 之后添加标签:continue
    【解决方案2】:

    您有 2 个不相关的问题。

    第 1 部分 - 重命名文件

    如果要重命名目录中匹配“* *.txt”的所有.txt文件,则可以执行以下操作:

    :: Preserve any existing files that have no extension
    ren *. *.preserve
    :: Strip off everything from the space onward
    ren "* *.txt" "* "
    :: Restore the .txt extension
    ren *. *.txt
    :: Restore the files with no extension
    ren *.preserve *.
    

    此解决方案有 4 个步骤,但它是批量操作的,因此可以非常快速地重命名大量文件。

    请参阅How does the Windows RENAME command interpret wildcards? 以获得有关上述工作原理的帮助

    上面还会重命名文件,如“word1 word2 45.txt”或“word1 word2.txt”。您可以使用以下脚本更具体。

    @echo off
    for /f "delims=" %%F in (
      'dir /b /a-d "* *.txt"^|findstr /ric:"^[^ ][^ ]* [0-9][0-9]*\.txt$"
    ) do for /f %%A in ("%%F") do ren "%%F" "%%A.txt"
    

    第二种方案非常精确,但它必须迭代每个文件,所以如果文件数量很大,它会变慢。

    第 2 部分 - 在两个变量中捕获每一行的内容

    @echo off
    for /f "usebackq tokens=1,2" %%A in ("house 21.txt") do (
      echo the word = %%A
      echo the number = %%B
    )
    

    一旦您将行解析为 FOR 变量 %%A%%B,您就可以对它们做任何您想做的事情。你可以设置一个环境变量......,无论如何。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 2020-02-08
      • 2021-07-09
      相关资源
      最近更新 更多