Powershell 在合并到另一个文件夹时维护子文件夹结构[将存在重复的文件夹名]
我目前收到关于门票和回复的电子邮件。它们会自动以pdf格式发送到文件夹中。我为他们制作封面。因此,重要的3个部分最终将成为一个大的pdf(封面、门票和回复)。 票号是14位数字,通常电子邮件在主题行(即pdf标题)的某处包含该票号。因此,我使用BulkRenameUtibility和正则表达式将每张票证重命名为14位票号,后面加“-ticket”。然后,所有响应都会被命名为14位票号,前缀为2(以便pdftk最后合并它),如果有多个响应,则按顺序编号。所有封面都会自动生成“10A-”,然后是14位票号,然后是工作编号。票号的格式为YYMMDDHHNN。这使得pdftk将它们编译为封面、票证,然后是响应。 但在pdftk将PDF合并为一个PDF之前。我需要它们在同一个文件夹中。我使用一个批处理脚本将所有封面排序到一个文件夹中,文件夹名为14位票证名称,回复和票证也是如此。因此,我最终得到了(取决于票数,现在我有96个)许多这样的子文件夹Powershell 在合并到另一个文件夹时维护子文件夹结构[将存在重复的文件夹名],powershell,batch-file,merge,directory,Powershell,Batch File,Merge,Directory,我目前收到关于门票和回复的电子邮件。它们会自动以pdf格式发送到文件夹中。我为他们制作封面。因此,重要的3个部分最终将成为一个大的pdf(封面、门票和回复)。 票号是14位数字,通常电子邮件在主题行(即pdf标题)的某处包含该票号。因此,我使用BulkRenameUtibility和正则表达式将每张票证重命名为14位票号,后面加“-ticket”。然后,所有响应都会被命名为14位票号,前缀为2(以便pdftk最后合并它),如果有多个响应,则按顺序编号。所有封面都会自动生成“10A-”,然后是14
.....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文件并将其保存在父文件夹中
我真的需要一些帮助,让封面、回复和票证的子文件夹移动到完整文件夹合并重复的FolderName,为每个票证号码创建一个包含我所有文件的文件夹,这样我就可以运行下面的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之前,所有文件夹都会重命名为作业名称。我会继续使用更现代的脚本语言。 我在rama磁盘上创建了一个测试环境:
## 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
sub中的
%~dpnx0
表示sub的名称,而不是批次的名称。在一个过于宽泛的问题上还有其他错误。将此限制为单个问题。批处理脚本可以正常工作。我只是想展示我目前使用的流程。我需要的是将相同名称的文件夹从三个子文件夹“合并”到一个父文件夹。每次我尝试时,它都会覆盖文件夹,结果我只能得到“回复”或“票证”。是否有powershell或batch cmd通知Windows资源管理器合并文件夹(如果文件夹已存在且未覆盖)?