合并到另一个文件夹时保持SubSubFolder结构[将存在重复的FolderNames]

时间:2018-05-18 20:57:08

标签: powershell batch-file merge directory

我目前收到门票和回复的电子邮件。它们会自动以pdf格式发送到文件夹。我为他们创建封面。所以必不可少的3个部分最终将成为一个大的pdf(封面,票证和响应)。 票号是14位数,通常电子邮件在主题行的某处包含该票号(这是pdf标题)。所以我使用BulkRenameUtility和Regex将每张票重命名为14位票号,后面加“-Ticket”。然后,所有响应都被命名为14位票号,前缀为2(以便pdftk将其最后组合),并且如果有多个响应按顺序编号。所有封面都会自动生成“10A-”,然后是14位票号,然后是作业号。票号的格式为YYMMDDHHNN ####。这使得pdftk将这些编译为Cover,ticket,然后响应。 但是在pdftk可以将pdf合并为一个之前。我需要他们在同一个文件夹中。我使用批处理脚本将所有封面分类到一个文件夹中,其中14位票证名称为foldername,响应和票证相同。所以我最终得到(根据门票的数量,现在我有96个)像这样的许多子文件夹。

.....OpenLocates
..........Current
...............Complete
....................[EMPTY]
...............Covers #There will be one cover per job.
....................18051400000001
.........................10A-18051400000001_218001.pdf
....................18051400000002
.........................10A-18051400000002_217022.pdf
...............Responses #There will be multiple responses per ticket.
....................18051400000001
.........................218051400000001.pdf
.........................218051400000001_1.pdf
.........................218051400000001_2.pdf
....................18051400000002
.........................218051400000002.pdf
.........................218051400000002_1.pdf
.........................218051400000002_2.pdf
...............Tickets #There *can* be multiple tickets per job.
....................18051400000001
.........................18051400000001-Ticket.pdf
....................18051400000002
.........................18051400000002-Ticket.pdf

我需要的是将所有这些子文件夹合并为一个。不应该有重复的文件名,因为BRU在首次重命名pdf文件时会按顺序编号重复。

.....OpenLocates
..........Current
...............Complete
....................18051400000001
.........................10A-18051400000001_218001.pdf
.........................18051400000001-Ticket.pdf
.........................218051400000001.pdf
.........................218051400000001_1.pdf
.........................218051400000001_2.pdf
....................18051400000002
.........................10A-18051400000002_217022.pdf
.........................18051400000002-Ticket.pdf
.........................218051400000002.pdf
.........................218051400000002_1.pdf
.........................218051400000002_2.pdf

批处理脚本是:

@echo on

::CALLALL
Call :SortCovers
Call :SortResponses
Call :SortTickets
goto :EOF

:SortCovers
cd L:\OpenLocates\Current\Covers

for /f %%a in ('dir /a-d /b') do (
    if not "%%~dpnxa"=="%~dpnx0" call :SortCoversFunction "%%~a"
    )

goto :EOF

:SortCoversFunction
set file=%~1
set dir=%file:~4,14%
md "%dir%" 2>nul
move "%file%" "%dir%"
goto :EOF

:SortResponses
cd L:\OpenLocates\Current\Responses

for /f %%a in ('dir /a-d /b') do (
    if not "%%~dpnxa"=="%~dpnx0" call :SortResponsesFunction "%%~a"
    )

goto :EOF


:SortResponsesFunction
set file=%~1
set dir=%file:~1,14%
md "%dir%" 2>nul
move "%file%" "%dir%"
goto :EOF


:SortTickets
cd L:\OpenLocates\Current\Tickets

for /f %%a in ('dir /a-d /b') do (
    if not "%%~dpnxa"=="%~dpnx0" call :SortTicketsFunction "%%~a"
    )

goto :EOF

:SortTicketsFunction
set file=%~1
set dir=%file:~0,14%
md "%dir%" 2>nul
move "%file%" "%dir%"
goto :EOF

现在我剪切/粘贴文件夹,然后在Windows资源管理器中的合并弹出窗口中单击“确定”。 但我必须在下周将我的整个过程教给另一个人,我想简化它。 合并完所有文件夹后,我运行一个带有PDFTK的PowerShell脚本来合并pdf文件并将它们保存在父文件夹中。

我真的可以使用一些帮助来获取Covers,Responses和Tickets的子文件夹以移动到Complete文件夹,合并重复的foldernames以创建一个文件夹,其中包含每个票号的所有文件,因此我可以运行以下powershell脚本它确实以正确的顺序成功地将它们组合在一起。

$pdftk = "C:\SymLinks\Combine\pdftk.exe"
$inputFolder = "L:\OpenLocates\Current\Complete"
gci $inputfolder -r -include *.pdf | sort-object | group DirectoryName | % {& $PDFtk $_.group CAT OUTPUT "$($_.Name | Split-Path -Parent)\$($_.Name | Split-Path -Leaf).pdf" verbose}

非常感谢任何帮助。我已经尝试了几个不同的批处理和PowerShell脚本,似乎没有一个适合我。

编辑:在合并PDF之前,我会将一个作业的所有票号组合到一个文件夹中。在组合最终PDF之前,所有文件夹也会重命名为作业名称。

1 个答案:

答案 0 :(得分:0)

我会留在更现代的脚本langugage。 我在我的ramdisk A:

上创建了一个测试环境
## Q:\Test\2018\05\19\SO_50419164.ps1

$Sources = ("A:\OpenLocates\Current\Covers\",
            "A:\OpenLocates\Current\Responses\",
            "A:\OpenLocates\Current\Tickets\")

$Target =   "A:\OpenLocates\Current\Complete\"

ForEach ($Source in $Sources){
    Get-ChildItem $Source -Directory | ForEach-Object {
        $TargetSub = Join-Path $Target $_.Name
        If (!(Test-Path $TargetSub)){ MD $TargetSub |Out-Null}
        Get-ChildItem $_.FullName -File | Move -Dest $TargetSub
        Remove-Item $_.FullName
    }
}

树a:/ F之前

A:\
└───OpenLocates
    └───Current
        ├───Complete
        ├───Covers
        │   ├───18051400000001
        │   │       10A-18051400000001_218001.pdf
        │   │
        │   └───18051400000002
        │           10A-18051400000002_217022.pdf
        │
        ├───Responses
        │   ├───18051400000001
        │   │       218051400000001.pdf
        │   │       218051400000001_1.pdf
        │   │       218051400000001_2.pdf
        │   │
        │   └───18051400000002
        │           218051400000002.pdf
        │           218051400000002_1.pdf
        │           218051400000002_2.pdf
        │
        └───Tickets
            ├───18051400000001
            │       18051400000001-Ticket.pdf
            │
            └───18051400000002
                    18051400000002-Ticket.pdf

运行脚本后:

A:\
└───OpenLocates
    └───Current
        ├───Complete
        │   ├───18051400000001
        │   │       10A-18051400000001_218001.pdf
        │   │       18051400000001-Ticket.pdf
        │   │       218051400000001.pdf
        │   │       218051400000001_1.pdf
        │   │       218051400000001_2.pdf
        │   │
        │   └───18051400000002
        │           10A-18051400000002_217022.pdf
        │           18051400000002-Ticket.pdf
        │           218051400000002.pdf
        │           218051400000002_1.pdf
        │           218051400000002_2.pdf
        │
        ├───Covers
        ├───Responses
        └───Tickets