在batch file中使用dir&ren命令在目录/子目录中生成文件夹list.txt文件并将list.txt重命名为文件夹/子文件夹名称

我在尝试着 :

  1. 列出文本文件中子文件夹中每个文件夹的内容,
  2. 将文本文件放在父文件夹以及子文件夹中,
  3. 将输出文本文件重命名为父文件夹/子文件夹的名称。

为了实现这一点,我已经尝试过以下批处理脚

del /s __List.txt for /F "delims=" %%G IN ('dir /b /s') DO @echo "%%G">>"%%~__List.txt" for /r %%a in (__List.txt) do for %%b in ("%%~dpa\.") do ren "%%~a" "%%~nxb%%~xa" pause 

现在

  1. 我可以列出每个文件夹的文件,
  2. 正在创build__List.txt
  3. __List.txt被重命名为子文件夹。

问题是:

  1. 空文件夹不被打印。
  2. 如果有任何目录已经有“directory / Subdirectory Name.txt”,得到这个错误

    存在重复的文件名或找不到该文件

  3. 在控制台窗口中显示错误。 (首选的方法可能是创build一个错误日志,并将其放在父文件夹中。)然而,它是可选的。

以下是可以引用的答案,因为部分查询单独发布在其中:

  1. .bat将文件夹/子文件夹中的文件重命名为特定名称
  2. batch file:列出目录中的所有文件,以.txt格式打印,并将输出文件放在所有子目录中
  3. 批文件 – 根据父文件名和(子)文件夹名重命名文件

文件夹结构示例:

  • 父文件夹
    • 子文件夹-01
      • __filelist.txt
        使用命令 dir 创build内容列表 并转换为 Sub Folder-01.txt
      • 一些数据文件1.xyz
      • 一些数据文件2.xyz
      • 一些数据文件3.xyz
    • 子文件夹-02-空
      • 子子文件夹-01
        • __filelist.txt
          “文件已存在” 错误的 可能原因
        • some-Data-files_A.xyz
        • some-Data-files_B.xyz
        • some-Data-files_C.xyz
      • __filelist.txt
        没有生成由于空白文件夹。 “找不到文件” 错误的 可能原因
    • batch_file.bat
    • __filelist.txt
    • some-file.xyz

可能需要两折解决scheme

  1. 命令dir命令应该生成filelist.txt即使文件夹是空的,它将解决'找不到文件'的错误。

  2. 命令ren应该覆盖现有的filelist.txt或将现有的filelist.txt以增量顺序重命名为filelist1-100.txt 。 它可能会解决'文件已经存在'的错误。

试试这个评论的批处理文件:

 @echo off setlocal if "%~1" == "" goto UseCD rem The start folder is either the current folder on running the batch file rem or the folder specified as first argument on starting the batch file. rem All / (Unix/Mac) in specified folder path are replaced by \ (Windows). rem The folder path must not end with a backslash for this task. set "StartFolder=%~1" set "StartFolder=%StartFolder:/=\%" if "%StartFolder:~-1%" == "\" set "StartFolder=%StartFolder:~0,-1%" if exist "%StartFolder%\" goto CreateLists rem The environment variable CD (Current Directory) holds the entire path rem to the current folder ending not with a backslash, except the current rem folder is the root folder of a drive. :UseCD if not "%CD:~-1%" == "\" ( set "StartFolder=%CD%" ) else ( set "StartFolder=%CD:~0,-1%" ) rem The error log file in start folder existing perhaps from a previous rem run is deleted first before the list file is created recursively in rem each folder of the start folder. :CreateLists set "ErrorLogFile=%StartFolder%\Error.log" %SystemRoot%\System32\attrib.exe -h -r -s "%ErrorLogFile%" >nul del "%ErrorLogFile%" 2>nul call :RecursiveList "%StartFolder%" endlocal rem Avoid an unwanted fall through to the subroutine. goto :EOF rem RecursiveList is a subroutine called for each folder found rem in the start folder and its subfolders. rem For the root folder of a drive like C: the list file name is "DriveC.txt". rem For all other folders the list file name is "Folder Name.txt". rem The command DEL does not delete a file which has hidden, read-only or rem system attribute set. For that reason ATTRIB is called first to remove rem those attributes from a perhaps already existing list file in current rem folder. ATTRIB outputs an error message because of not existing file rem to handle STDOUT which is the reason for >nul which redirects this rem not important error message to device NUL. rem Next the list file is deleted with suppressing the error message output rem by command DIR to handle STDERR with 2>nul if the file does not exist rem at all. But in case of the file really exists and could not be deleted rem (NTFS permissions, file access denied because file is opened in another rem application), an error message is logged into error log file in start rem folder which is hopefully not write-protected, too. rem Creating a list file in a folder is skipped if there is already rem a list file and it could not be deleted by command DEL. rem Otherwise the command DIR is used to write first the names of the rem subfolders in alphabetical order according to name (not alphanumeric) rem into the list file of current folder and next append the names of all rem files in current folder also ordered by name. The name of the list file rem is included in list file. Comment the two lines with command DIR and rem uncomment the 3 lines below to avoid this by first writing the folder rem and files names into a list file in temporary files folder and then rem move this list file with correct list file name to the current folder. rem Last for each subfolder in current folder the subroutine RecursiveList rem calls itself until all subfolders in current folder have been processed. :RecursiveList set "FolderPath=%~1" if "%FolderPath:~2%" == "" ( set "ListFileName=Drive%FolderPath:~0,1%.txt" ) else ( set "ListFileName=%~nx1.txt" ) %SystemRoot%\System32\attrib.exe -h -r -s "%FolderPath%\%ListFileName%" >nul del "%FolderPath%\%ListFileName%" >nul 2>&1 if exist "%FolderPath%\%ListFileName%" ( echo Failed to update: "%FolderPath%\%ListFileName%">>"%ErrorLogFile%" goto ProcessSubFolders ) dir /AD /B /ON "%FolderPath%">"%FolderPath%\%ListFileName%" 2>nul dir /AD /B /ON "%FolderPath%">>"%FolderPath%\%ListFileName%" 2>nul rem dir /AD /B /ON "%FolderPath%">"%TEMP%\%~n0.tmp" 2>nul rem dir /AD /B /ON "%FolderPath%">>"%TEMP%\%~n0.tmp" 2>nul rem move "%TEMP%\%~n0.tmp" "%FolderPath%\%ListFileName%" :ProcessSubFolders for /D %%I in ("%FolderPath%\*") do call :RecursiveList "%%~I" goto :EOF rem The command above exits the subroutine RecursiveList. The batch rem file processing is continued in previous routine which is again rem the subroutine RecursiveList or finally the main batch code above. 

批处理文件将每个文件夹列表文件写入该文件夹中的子文件夹和文件的名称。

例如, Sub Folder-02-Empty.txt只包含

 Sub-Sub Folder-01 Sub Folder-02-Empty.txt 

Sub-Sub Folder-01.txt包含给定的例子:

 __filelist.txt some-Data-files_A.xyz some-Data-files_B.xyz some-Data-files_C.xyz Sub-Sub Folder-01.txt 

如果列表文件的名称不应包含在列表文件中,请阅读注释以排除列表文件。

为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • attrib /?
  • call /?
  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?