代码之家  ›  专栏  ›  技术社区  ›  AmandaKay10

在合并到另一个文件夹时维护子子文件夹结构[将存在重复的文件夹名]

  •  0
  • AmandaKay10  · 技术社区  · 7 年前

    我目前收到门票和回复的电子邮件。它们会自动以pdf格式发送到文件夹中。我为他们创建封面。因此,重要的三个部分最终将成为一个大pdf(封面、门票和回复)。 票号为14位数字,通常电子邮件的主题行(即pdf标题)某处包含该票号。因此,我使用BulkRenameUtility和Regex将每张票重命名为14位数的票号,后面加“-ticket”。然后将所有响应命名为14位票号,前缀为2(以便pdftk最后合并),如果有多个响应,则按顺序编号。所有封面都会自动生成“10A-”,然后是14位的票号,然后是作业号。票号的格式为YYMMDDHHNN#####。这使得pdftk将其编译为封面、票证,然后是响应。 但在pdftk将PDF合并为一个PDF之前。我需要它们在同一个文件夹中。我使用一个批处理脚本将所有封面排序到一个文件夹中,文件夹名为14位票证名称,回复和票证也是如此。因此,我最终得到了(取决于门票数量,现在我有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文件并将其保存在父文件夹中。

    我真的需要一些帮助才能将封面、回复和票据的子文件夹移出到完整的文件夹中,合并重复的文件夹名,为每个票据编号创建一个包含我所有文件的文件夹,这样我就可以运行以下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 回复  |  直到 7 年前
        1
  •  0
  •   user6811411 user6811411    7 年前

    我会选择更现代的脚本语言。 我在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