问题描述
因此,我正在编写一个批处理脚本,以将子文件夹中的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文件,则无需知道其名称,只需使用全局*.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
请注意,我没有考虑到脚本的任何后续运行都可能将同一文件移动并重命名到另一个级别。为了处理此类问题,我需要先了解有关您的特定树结构和命名模式的更多信息,然后再考虑哪种方法最好。
,如果一个目录中有多个.csv文件,此PowerShell脚本将完成此操作并显示警告。当您对文件将被正确移动和重命名感到满意时,请从-WhatIf
命令中删除Move-Item
。
Get-ChildItem -Directory -Path 'C:\src\t\Royal Mail\Results' |
ForEach-Object {
$FileToMove = Get-ChildItem -File -Path $_.FullName -Filter '*.csv'
if ($FileToMove.Count -eq 1) {
$NewBaseName = Split-Path -Path $_.FullName -Leaf
Move-Item -Path $FileToMove.FullName `
-Destination (Join-Path -Path $_.Parent -ChildPath "$NewBaseName.csv") -WhatIf
} else {
Write-Warning "Directory $($_.FullName) contins multiple .csv files."
}
}
如果您无法使用PowerShell控制台,请将上面的脚本保存在Move-RoyalMailFiles.ps1文件中,然后使用以下命令在cmd.exe或.bat文件脚本中运行它:
powershell -NoLogo -NoProfile -File 'Move-RoyalMailFiles.ps1"