我想:
为了实现这一点,我尝试了以下批处理脚本
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
现在
__List.txt
,__List.txt
正在重命名为子文件夹。问题是:
存在重复的文件名或找不到文件
可以在回答时引用以下内容,因为查询的一部分单独发布在其中:
文件夹结构示例:
Sub Folder-01.txt
。可能需要双倍解决方案
命令 dir 命令应生成filelist.txt
即使文件夹为空,也会解析“找不到文件”错误。
命令 ren 应覆盖现有filelist.txt
或按增量顺序将现有filelist.txt
重命名为filelist1-100.txt
。它可能会解决“文件已存在”错误。
答案 0 :(得分:0)
试试这个评论的批处理文件:
@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 /?