batch-file - 将子文件夹中的文件批量重命名为父文件夹名称
问题描述
所以我正在编写一个批处理脚本来将子文件夹中的 CSV 文件重命名为与其父文件夹相同的名称。例如,文件R:\Royal Mail\Results\202008101416151232.rm\results.csv
将变为R:\Royal Mail\Results\202008101416151232.rm\202008101416151232.rm.csv
. 每个文件夹中只有一个 CSV。
完成后,文件被向上移动一个目录,以便另一个软件可以处理它。我已经完成了这项工作,但问题是它当前重命名了主文件夹和子目录中的文件。例如,它将重命名R:\Royal Mail\Results\202008101416151232.rm.csv
为R:\Royal Mail\Results\Results.csv
.
这是我到目前为止的代码:
@echo off
set folder="\\rackstation\Couriers\Royal Mail\Results"
rem Rename CSV files to parent folder name
for /r %folder% %%D in (.) do (
for /f "delims=" %%F in ('dir /b /A:-D "%%D"') do ren "%%D\%%F" "%%~nxD%%~xF"
echo %%D
)
rem Move CSV files to previous folder
FOR /R %folder% %%i IN (*.csv) DO MOVE "%%i" %folder%
rem Deletes empty folders
for /f "delims=" %%i in ('dir %folder% /s /b /ad ^| sort /r') do rd "%%i"
我已经尝试了几件事,但没有设法添加一个 if 条件来说明如果%%D = "\\rackstation\Couriers\Royal Mail\Results"
不重命名文件。
任何人都可以修改这个脚本来做到这一点吗?
解决方案
以下方法应该只对仅包含一个 CSV 文件的任何子目录执行该任务,因此如果由于某种原因您有一个包含其中两个文件的子目录,则无需担心。它用于Dir
处理目录名称,以便在处理文件之前完成目录解析。这可确保重命名和移动的文件不会被回收回循环中。如果只有一个 CSV 文件,则无需知道其名称,只需使用 glob, *.csv
, 进行移动和重命名操作,如果该操作成功,请尝试删除目录,(只会成功如果它现在是空的)。
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "folder=\\rackstation\Couriers\Royal Mail\Results"
For /F Delims^=? %%D In (
'Dir /B/S/A:D-S-L "%folder%"'
)Do (
Set "_="
For /F "Skip=6Tokens=3" %%C In (
'""%__AppDir__%Robocopy.exe" "%%D" Null "*.csv" /L /NFL /NDL /NJH"'
)Do If "%%C"=="1" If Not Defined _ (
Set "_=T"
Move /Y "%%D\*.csv" "%%D\..\%%~nxD.csv"&&RD "%%D" 2>NUL
)
)
Pause
GoTo :EOF
你也可以PushD
用来确保你从一开始就在源文件夹中,只有在你完成后才返回。
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "folder=\\rackstation\Couriers\Royal Mail\Results"
PushD "%folder%" 2>NUL||GoTo :EOF
For /F Delims^=? %%D In (
'Dir /B/S/A:D-S-L'
)Do (
Set "_="
For /F "Skip=6Tokens=3" %%C In (
'""%__AppDir__%Robocopy.exe" "%%D" Null "*.csv" /L /NFL /NDL /NJH"'
)Do If "%%C"=="1" If Not Defined _ (
Set "_=T"
Move /Y "%%D\*.csv" "%%D\..\%%~nxD.csv"&&RD "%%D" 2>NUL
)
)
PopD
Pause
GoTo :EOF
请注意,我没有考虑到脚本的任何后续运行都可能将同一文件移动和重命名到另一个级别。为了处理此类事情,我需要了解有关您的特定树结构和命名模式的更多信息,然后再考虑哪个可能是最好的。
推荐阅读
- android - 如何在phoneauth中从firebase中检索号码
- javascript - 如何从函数组件获取值到类组件(App.js)?
- java - 如何编写代码来提供数组的反转。我是java初学者
- java - 从 Play 商店下载 Google 地图时无法使用
- node.js - forEach 循环中的 Firestore add() 不起作用
- html - 孩子如何只能使用 CSS 访问它的父属性?可能吗?
- angularjs - Angular Js 的 Kendo UI
- emacs - 结合 org-sparse-tree 和 ivy-swiper 以结构化方式搜索关键字
- python - Pandas 和 Numpy 的不同标准差
- discord.js - 如何根据新更新在不和谐机器人中设置自定义状态?