将子文件夹中的文件批量重命名为父文件夹名称

问题描述

因此,我正在编写一个批处理脚本,以将子文件夹中的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"

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...