在一个目录/子目录中使用dir和ren命令批量生成文件夹列表.txt文件并将list.txt重命名为文件夹/子文件夹名称

4
我正在尝试:
  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. __List.txt正在创建,
  3. __List.txt正被重命名为子文件夹。

问题是:

  1. 空文件夹不被打印出来。
  2. 如果任何目录已经有 "directory/Subdirectory Name.txt",会出现此错误

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

  3. 在控制台窗口中显示错误。 (最好的方法可能是创建一个错误日志并将其放置在父文件夹中。)这是可选的。

以下内容可以作为参考,因为其中一部分单独发布在它们的网站上:

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

文件夹结构示例:

  • 父文件夹
    • 子文件夹-01
      • __filelist.txt
        使用命令 dir 创建的内容列表和转换为 Sub Folder-01.txt
      • 一些数据文件 1.xyz
      • 一些数据文件 2.xyz
      • 一些数据文件 3.xyz
    • 子文件夹-02-空
      • 子子文件夹-01
        • __filelist.txt
          '文件已存在' 错误背后的可能原因。
        • 一些数据文件_A.xyz
        • 一些数据文件_B.xyz
        • 一些数据文件_C.xyz
      • __filelist.txt
        由于空白文件夹未生成。 '文件未找到' 错误的可能原因。
    • batch_file.bat
    • __filelist.txt
    • 一些文件.xyz

可能需要两个解决方案

  1. 即使文件夹为空,命令dir也应该生成filelist.txt,这将解决“找不到文件”的错误。

  2. 命令ren应该覆盖现有的filelist.txt或将现有的filelist.txt重命名为filelist1-100.txt,按增量顺序排列。这可能会解决“文件已存在”的错误。


@Mofi,我该说什么呢...你的回答真是太棒了。完美、优秀、出色!正是我想要的。你解释得非常清楚,让我可以轻松地进行自定义和修改。非常感谢你。(有一个愚蠢的问题),顺便问一下,接受这个答案的绿色勾选按钮在哪里? - manaswin
@mofi 刚刚遇到了一个问题,脚本在一个有大量文件的文件夹中运行时显示“系统找不到指定的路径”。但在文件数量较少的文件夹中运行良好。 - manaswin
“where lacs of files present”这个短语是什么意思?我不理解。请注意:文件夹路径的最大长度在Windows命令进程中限制为MAX_PATH(260)。有关更多详细信息,请参见为什么Windows存在260个字符的路径长度限制?您是否因文件夹树中的太多或太长的文件夹名称而遇到此限制? - Mofi
1个回答

1

尝试这个有注释的批处理文件:

@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 /A-D /B /ON "%FolderPath%">>"%FolderPath%\%ListFileName%" 2>nul

rem dir /AD /B /ON "%FolderPath%">"%TEMP%\%~n0.tmp" 2>nul
rem dir /A-D /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 /?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接