【问题标题】:Copy, rename and move all files in directory复制、重命名和移动目录中的所有文件
【发布时间】:2021-05-09 20:16:02
【问题描述】:

我有许多 pdf 文件需要复制、重命名和移动。
复制和移动作品——我只是不知道重命名部分是如何完成的。

文件如下所示:

2021-05-05_10-10-12-609_Testperson_Nancy_2512489996_19490816_OD_20210429112706.pdf  
2021-06-05_11-11-12-135_Testperson_with_many _Names_0708681234_19490817_OD_20210429112715.pdf  

我需要将它们重命名为:

251248-9996_19490816_OD_20210429112706.pdf  
070868-1234_19490817_OD_20210429112715.pdf  

因此需要从右侧的第四个_(没有第一个_)与[6] 和[7] 之间的- 子串。

这是我目前得到的:

SET input=c:\temp\rename\input
SET backup=c:\temp\rename\backup
SET output=c:\temp\rename\output

if not exist "%backup%" mkdir "%backup%"
for /f "tokens=*" %%F IN ('DIR /S /B "%input%\*.pdf"') DO (
xcopy /-y "%%F" "%backup%" & move "%%F" "%output%"
)

c:\temp\rename\input(对于原始文件) c:\temp\rename\backup (原始文件的备份目录) c:\temp\rename\output(重命名文件)

这必须在 Windows Server 上作为计划的批处理文件作业运行(我知道如何运行该作业)

【问题讨论】:

  • 格式总是这样吗? 2021-05-05_10-10-12-609_Testperson_Nancy_2512489996_19490816_OD_20210429112706.pdf
  • 是的——但唯一固定的是最后四个“_”。 _0708681234_19490817_OD_20210429112715.pdf _0708684123_145521747587_OD_20210429112715.pdf
  • 好的,你需要提供一些真实的场景,这是标准的抛出。 2021-06-05_11-11-12-135_Testperson_with_many _Names_0708681234_19490817_OD_20210429112715.pdf 所以请提供实际示例,如果需要,您可以更改名称,但格式在这里很关键。
  • 文件的第一部分可以根据人的名字改变字数。最后四个下划线将始终存在,但中间的数字/文本的长度可能会有所不同,除了第一个(例如 Mr. Croft 0708681234)该数字将始终为 10 个字符长。 2021-06-05_11-11-12-135_Jim_Johnson_Hansen_Croft_0708681234_19490817_OD_20210429112715.pdf 2021-05-05_10-10-12-609_John_Doe_2512489pdf196_1914_ABC_296_1914_ABC_20.pdf
  • 所以_没有固定数量?

标签: batch-file file-rename


【解决方案1】:

试一试。我建议您先备份文件,然后再在生产文件中运行它:

@echo off & setlocal enabledelayedexpansion
set "input=c:\temp\rename\input"
set "backup=c:\temp\rename\backup"
set "output=c:\temp\rename\output"
mkdir "%backup%">nul 2>&1
for /f "delims=" %%i in ('dir /b /s /a-d "%input%\*.pdf"') do (
    set "cnt=-4"
    set "_tmp=%%~i"
    set "_tmp=!_tmp: =-!
    set "_strip=!_tmp:_= !"
    for %%c in (!_strip!) do (
    set /a cnt+=1
 )
    if !cnt! gtr 1 if defined _tmp call :parser !cnt! "%%i"
)
goto :eof
:parser
for /f "tokens=%~1,* delims=_" %%a in ("%~2") do set "fin=%%~b"
echo xcopy /-y "%~2" "%backup%"
echo move "%~2" "%output%\%fin:~0,6%-%fin:~6%"

一些注意事项。这没有执行实际的copymove,它只会echo 结果,作为安全措施。所以一旦你看到它做了它应该做的,那么你可以从最后两行中删除echo

最后,这是假设您提供的文件格式,但它确实可以满足空格和双 _ 但如果您有另一个不属于标准的_ 分隔部分,它会向南格式。

演示 鉴于您在问题和评论中给出的 4 个示例(我的示例中的 C:\tmp\Input 除外,因为我使用不同的目录进行测试):

【讨论】:

  • 看起来它正在工作,不幸的是,它在丹麦很晚,所以我将在早上继续测试。感谢您的帮助 - 将让您随时了解它的工作原理。
  • 我已经修改了代码以包含您当前的代码,您应该能够按原样运行它,显然通过删除两行上的echos。
【解决方案2】:

您可能可以使用 PowerShell 更轻松地完成此操作,但为了保持话题,这里有一个 ,它从 获得了一些帮助:

@Echo Off
SetLocal EnableExtensions
Set "input=C:\temp\rename\input"
Set "backup=C:\temp\rename\backup"
Set "output=C:\temp\rename\output"
For /F "Tokens=1-2 Delims=|" %%G In (
    '%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile
     "Get-ChildItem -LiteralPath '%input%' -Filter '*_*_*_*_*.pdf' -File | "
     "ForEach-Object { $_.FullName + '|' + "
     "(($_.Name).Split('_')[-4]).Insert(6,'-') + '_' + "
     "(($_.Name).Split('_')[-3..-1] -Join('_')) }"') Do (
    Echo=%SystemRoot%\System32\xcopy.exe "%%G" "%backup%\" && (
        Echo=Move /Y "%%G" "%output%\%%H"))
Pause

目前脚本只会向您显示它将运行的命令,如果您对输出感到满意,则从行 1213 以及可选的最后一行中删除 Echo=。作为旁注,我在 目标处使用了尾部反斜杠,如果%backup% 尚不存在,这将导致创建它。

【讨论】:

    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多