我有一個根檔案夾,其中包含許多子檔案夾,每個子檔案夾都有多個 PDF。
$pdftk = "C:Program Files (x86)PDFtkinpdftk.exe"
$RootFolder = "根檔案夾的路徑"。
Get-ChildItem -r -include *.pdf | group DirectoryName | % {& $PDFtk $_. group CAT OUTPUT "$($_.Name | Split-Path -Parent)$($_.Name | Split-Path -Leaf)_merged.pdf" }。
該腳本按要求作業,但是我將處理非常大的資料量,為此我需要在合并完成后從每個檔案夾中洗掉原始PDF。
基本上,我需要腳本在第一個檔案夾4830_2017中查找,創建合并后的檔案4830_2017_merged.pdf,然后洗掉位于4830_2017檔案夾內的PDF,再轉到下一個檔案夾,并做同樣的事情。
我正在努力尋找在合并后洗掉每個檔案夾的內容的正確方法。
謝謝你的幫助。
uj5u.com熱心網友回復:
在你的ForEach-Object腳本塊中,$_.Group包含每個組的,即每個目錄的System.IO.FileInfo實體,代表*.pdf檔案,所以你可以在合并成功后將它們輸送到Remove-Item:
(Get-ChildItem -Recurse -Filter *.pdf)|
Group-Object DirectoryName|
ForEach-Object {
& $PDFtk $_.Group.FullName CAT OUTPUT "$($_. Name | Split-Path -Parent)$($_.Name | Split-Path -Leaf)_merged.pdf"
if (0 -eq $LASTEXITCODE) { # If the merge succeeded. 如果合并成功。
$_.Group | Remove-Item # Delete.。
}
}
注意:
Get-ChildItem命令被括在(...)中,以確保其輸出在進一步處理之前被全部收集,以排除新*.pdf檔案被創建或舊檔案被洗掉影響遞回列舉的副作用。-Filter *.pdf被用來代替-Include *.pdf,后者在這種情況下功能相當,但性能更好,因為它將過濾委托給檔案系統的API,而不是在源頭--見這個答案. 。
& $PDFtk $_.Group改為& $PDFtk $_.Group.FullName,以確保傳遞完整的檔案路徑;注意,這在PowerShell (Core) 7 中已不再需要,在這里System. IO.FileInfo和System.IO.DirectoryInfo實體一致地字串化為其完整路徑 - 參見此答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/309300.html
標籤:

