批处理文件,记住复制的内容

时间:2015-12-15 18:13:24

标签: windows batch-file scripting

这是我需要做的第一个问题"扩展" Creating folder from file, copy initial file into folder and add prefix

这是输出批次

for /f "tokens=*" %%A in ('dir /b *.mp4') do (
    md "%%~nA"
    copy "%%~fA" "%%~nA\prefix_%%~nxA"
)

(如果有.mp4,请创建一个包含该文件名的文件夹并将.mp4复制到该文件夹​​中)

现在批处理文件应该记得"创建了什么文件夹,因此每次删除新创建的文件夹时都不会重新启动相同的操作。 我正在考虑"将名字写入.txt然后从蝙蝠以上进行休息"每个新的批处理任务都可以检查名称是否存在。如果没有=复制,如果是=什么都不做。

2 个答案:

答案 0 :(得分:2)

answer撰写的Aacini很好并且由我投票,但在某些条件下可能导致错误的MP4文件处理。

发生错误处理的条件是:

  1. * .mp4文件存储在FAT,FAT32或exFAT而不是NTFS驱动器上。

    在SD卡和USB记忆棒上经常使用的FAT驱动器上,文件系统根据文件分配表条目(通常最早的第一个)返回与模式匹配的文件,而不是按照NTFS文件系统始终按名称的字母顺序排序。

  2. 有MP4文件,其名称是其他名称较长的MP4文件的子字符串。

    例如,首先在FAT32驱动器上创建了一个文件Test1.mp4(文件分配表中的第一个),以及稍后创建的文件Test.mp4因此更新(文件中的第二个)分配表)。

  3. Aacini编写的通常正常工作的代码现在会在FAT32驱动器上显示较早的Test1.mp4和较新的Test.mp4

    • 创建目录Test1
    • Test1.mp4复制到目录Test1
    • Test1写入文本文件
    • 跳过Test.mp4的处理,因为已在文本文件中找到字符串Test作为Test1的子字符串。

    可以在以下条件下进行以下增强以避免这种不受欢迎的行为:

    1. 在命令 DIR 上使用参数/ON,使列表按名称按字母顺序排序,与NTFS驱动器一样。

    2. 确保未在文本文件中找到较长文件/目录名称中的当前文件/目录名称。

    3. 文件/目录名在Windows上不区分大小写,在使用选项/I在文本文件中搜索时也应考虑到这一点。

      第一个解决方案还使用命令 FIND ,它没有匹配整行的选项。因此,文件/目录名称与文本文件中的:一起写入,并且还使用周围的冒号进行搜索。冒号不能在文件或目录的名称中,使其成为良好的开始/结束分隔符。

      @echo off
      
      if not exist FoldersCreated.txt cd . > FoldersCreated.txt
      
      for /F "tokens=*" %%A in ('dir /A-D /B /ON *.mp4') do (
          %SystemRoot%\System32\find.exe /I ":%%~nA:" FoldersCreated.txt >NUL
          if errorlevel 1 (
              md "%%~nA"
              copy "%%~fA" "%%~nA\prefix_%%~nxA"
              echo :%%~nA:>>FoldersCreated.txt
          )
      )
      

      另一个解决方案是使用带选项/X FINDSTR ,只有在搜索的字符串与整行匹配时才能获得肯定的结果。

      @echo off
      
      if not exist FoldersCreated.txt cd . > FoldersCreated.txt
      
      for /F "tokens=*" %%A in ('dir /A-D /B /ON *.mp4') do (
          %SystemRoot%\System32\findstr.exe /I /L /M /X /C:"%%~nA" FoldersCreated.txt >NUL
          if errorlevel 1 (
              md "%%~nA"
              copy "%%~fA" "%%~nA\prefix_%%~nxA"
              echo %%~nA>>FoldersCreated.txt
          )
      )
      

      要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

      • copy /?
      • dir /?
      • echo /?
      • find /?
      • findstr /?
      • for /?
      • if /?
      • md /?

      <强>注意:

      必须注意关于尾随空格的第echo %%~nA>>FoldersCreated.txt行的第二个解决方案。应该没有尾随空格,否则 FINDSTR 永远不会以0为整行匹配退出。

      用作两个解决方案模板的Aacini发布的代码在此行末尾有1个空格,即此处有 foldersCreated.txt space 线。

      这个尾随空格被命令处理器解释为要通过命令 echo 输出的文本的一部分,因此由命令处理器执行:

      echo Test1  1>>FoldersCreated.txt
      echo Test  1>>FoldersCreated.txt
      

      因此代码行末尾的空格在文件名后移动,因此也写入文本文件。由于在调用 FINDSTR 时搜索字符串中没有尾随空格,因此永远不会有整行匹配。

      在文件名周围使用双引号是没有办法解决的,即

      echo %%~nA>>"FoldersCreated.txt"
      

      使用双引号时,命令处理器将尾随空格移动到文本末尾,以通过命令 echo 输出。

      使用

      也没有解决方案
      >>FoldersCreated.txt echo %%~nA
      

      因为命令处理器也执行此行,因此必须避免此行末尾的空格:

      echo %%~nA 1>>FoldersCreated.txt 
      

      因此%%~nA之后的任何空格仍然是 echo 输出的文本的一部分。

答案 1 :(得分:1)

@echo off

if not exist foldersCreated.txt cd . > foldersCreated.txt

for /f "tokens=*" %%A in ('dir /b *.mp4') do (
   find "%%~nA" foldersCreated.txt > NUL
   if errorlevel 1 (
      md "%%~nA"
      copy "%%~fA" "%%~nA\prefix_%%~nxA"
      echo %%~nA>> foldersCreated.txt 
   )
)