Беда с зацикливанием - PullRequest
       14

Беда с зацикливанием

0 голосов
/ 18 января 2019

Я пытаюсь разделить все файлы PDF в папке, а затем переместить их в выходную папку. Проблема в том, что программа, которую я использую (PDFtk), разделяет только один файл за раз.

Это прекрасно работает, если имеется только 1 файл, но часто пользователи сканируют несколько файлов одновременно, и это приводит к тому, что сценарий PowerShell пожимает плечами и просто выполняет переход к выводу без разделения файлов. Я неправильно использую ForEach?

$pdfPath = 'C:\Temp\Incoming'
$pdfoutPath = 'C:\Temp\Completed'
$pdfFile = Join-Path $pdfPath '*.pdf'
$SetsOfPages = 1
$Match = 'NumberOfPages: (\d+)'
$NumberOfPages = [regex]::Match((pdftk $pdfFile dump_data), $Match).Groups[1].Value
"{0,2} pages in {1}" -f $NumberOfPages, $pdfFile

Get-ChildItem $pdfFile | ForEach-Object {
    for ($Page=1; $Page -le $NumberOfPages; $Page+=$SetsOfPages) {
        $File = Get-Item $pdfFile
        $Range = "{1}" -f $page, [Math]::Min($Page+$SetsOfPages-1, $NumberOfPages)
        $OutFile = Join-Path $pdfoutPath ($File.BaseName + "_$Range.pdf")
        "processing: {0}" -f $OutFile
        pdftk $pdfFile cat $Range output $OutFile
    }
    Get-ChildItem $pdfoutPath '*.pdf' -Recurse | foreach {
        $new_folder_Year = Get-Date $_.LastWriteTime -Format yyyy
        $new_folder_Month = Get-Date $_.LastWriteTime -uformat %m
        $new_folder_Day = Get-Date $_.LastWriteTime -uformat %d
        $des_path = "${pdfoutPath}\${new_folder_Year}\${new_folder_Month}\${new_folder_Day}"

        if (Test-Path $des_path){ 
            Move-Item $_.FullName $des_path 
        } else {
            New-Item -ItemType Directory -Path $des_path
            Move-Item $_.FullName $des_path 
        }
    }
    Get-ChildItem $pdfPath '*.pdf' -Recurse | foreach {
        $new_folder_Year = Get-Date $_.LastWriteTime -Format yyyy
        $new_folder_Month = Get-Date $_.LastWriteTime -uformat %m
        $new_folder_Day = Get-Date $_.LastWriteTime -uformat %d
        $des_path = "${pdfoutPath}\${new_folder_Year}\${new_folder_Month}\${new_folder_Day}"

        if (Test-Path $des_path){ 
            Move-Item $_.FullName $des_path 
        } else {
            New-Item -ItemType Directory -Path $des_path
            Move-Item $_.FullName $des_path 
        }
    }

1 Ответ

0 голосов
/ 19 января 2019

Если я правильно интерпретирую ваш код, попробуйте этот сценарий:

## Q:\Test\2019\01\18\SO_542610444.ps1
$pdfPath    = 'C:\Temp\Incoming'
$pdfoutBase = 'C:\Temp\Completed'
$pdfFile    = Join-Path $pdfPath '*.pdf'

Get-ChildItem $pdfFile | ForEach-Object {
    "processing: {0}" -f $_.FullName
    $pdfOutPath = Join-Path $pdfoutBase $_.LastWriteTime.ToString('yyyy\\MM\\dd')
    MD $pdfoutPath | Out-Null
    $OutFile = Join-Path $pdfoutPath ("{0}_%03d.pdf" -f $_.BaseName)
    &pdftk "$($_.FullName)" Burst output $OutFile
}

он строит структуру папок из LastWriteTime (yyyy \ MM \ dd) и добавляет номер страницы с 3 местами к BaseName.

С этим входным файлом:

> gci .\Temp\Incoming\

    Directory: C:\Temp\Incoming

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-10-27     14:17       17540001 cc.18.01.pdf

Пример дерева после запуска сценария:

tree /F
C:.
└───Temp
    ├───Completed
    │   └───2018
    │       └───10
    │           └───27
    │                   cc.18.01_001.pdf
    │                   cc.18.01_002.pdf
%<...snip...>%
    │                   cc.18.01_155.pdf
    │                   cc.18.01_156.pdf
    │
    └───Incoming
            cc.18.01.pdf
...