Powershell - 将循环函数应用于子目录

时间:2014-08-12 12:48:18

标签: powershell pdf

我是Powershell的新手,我正在苦苦挣扎。我已经获得了一个我想要使用的功能的例子,并对其进行了部分修改。我想要的是它循环遍历C:\ Test \的每个子目录,并将每个子目录中的PDF组合在一起(将生成的PDF保留在每个子目录中)。

目前我可以通过子目录梳理它,但它然后将所有子目录的内容组合到顶级目录中的一个巨型PDF中,这不是我想要的。我觉得我可能需要使用各种各样的但我还不太了解Powershell。

BTW,它使用PDFSharp - 一个.Net库。

Function PDFCombine {            
$filepath = 'C:\Test\'
$filename = '.\Combined' #<--- ???                   

$output = New-Object PdfSharp.Pdf.PdfDocument            
$PdfReader = [PdfSharp.Pdf.IO.PdfReader]            
$PdfDocumentOpenMode = [PdfSharp.Pdf.IO.PdfDocumentOpenMode]                        

foreach($i in (gci $filepath *.pdf -Recurse)) {            
    $input = New-Object PdfSharp.Pdf.PdfDocument            
    $input = $PdfReader::Open($i.fullname, $PdfDocumentOpenMode::Import)            
    $input.Pages | %{$output.AddPage($_)}            
}                        

$output.Save($filename)            
}

2 个答案:

答案 0 :(得分:1)

未经测试......

Function PDFCombine {            
$filepath = 'C:\Test\'
$filename = '.\Combined' #<--- ???                   

$output = New-Object PdfSharp.Pdf.PdfDocument            
$PdfReader = [PdfSharp.Pdf.IO.PdfReader]            
$PdfDocumentOpenMode = [PdfSharp.Pdf.IO.PdfDocumentOpenMode]                        
$lastdir=""

foreach($i in (gci $filepath *.pdf -Recurse)) {            

    $input = New-Object PdfSharp.Pdf.PdfDocument            
    $input = $PdfReader::Open($i.fullname, $PdfDocumentOpenMode::Import)            
    $input.Pages | %{$output.AddPage($_)}   
    if ($lastdir -ne $_.directoryname){
        $lastdir=$_.directoryname
        $output.Save("$lastdir\$filename") 
        $output = New-Object PdfSharp.Pdf.PdfDocument  
    }
}                        


}

答案 1 :(得分:1)

您的问题不清楚您需要关闭多少级别。你可以尝试这个(未经测试)。从$filepath开始向下一级,获取该文件夹中的所有pdf文件及其子文件夹,并将它们合并到Subfoldername-Combined.pdf中:

Function PDFCombine {            
    $filepath = 'C:\Test\'

    $PdfReader = [PdfSharp.Pdf.IO.PdfReader]
    $PdfDocumentOpenMode = [PdfSharp.Pdf.IO.PdfDocumentOpenMode]

    #Foreach subfolder(FIRST LEVEL ONLY!)
    Get-ChildItem $filepath | Where-Object { $_.PSIsContainer } | Foreach-Object {
        #Create new ouput pdf-file
        $output = New-Object PdfSharp.Pdf.PdfDocument
        $outfilepath = Join-Path $_.FullName "$($_.Name)-Combined.pdf"

        #Find and add pdf files in subfolders
        Get-ChildItem -Path $_.FullName -Filter *.pdf -Recurse | ForEach-Object {
            #$input = New-Object PdfSharp.Pdf.PdfDocument #Don't think this one's necessary           
            $input = $PdfReader::Open($_.fullname, $PdfDocumentOpenMode::Import)            
            $input.Pages | %{ $output.AddPage($_) }
        }

        #Save
        $output.Save($outfilepath)
    }                      

}

所以你应该得到这个:

c:\Test\Folder1\Folder1-Combined.pdf #should include all pages in Folder1 and ANY subfolders below)
c:\Test\Folder2\Folder2-Combined.pdf #should include all pages in Folder2 and ANY subfolders below)
#etc.

如果你需要它为每个子文件夹(不仅是第一级)创建组合pdf,那么你可以尝试这个(未经测试):

Function PDFCombine {            
    $filepath = 'C:\Test\'

    $PdfReader = [PdfSharp.Pdf.IO.PdfReader]
    $PdfDocumentOpenMode = [PdfSharp.Pdf.IO.PdfDocumentOpenMode]

    #Foreach subfolder with pdf files
    Get-ChildItem -Path $filepath -Filter *.pdf -Recurse | Group-Object DirectoryName | ForEach-Object {
        #Create new ouput pdf-file
        $output = New-Object PdfSharp.Pdf.PdfDocument
        $outfilepath = Join-Path $_.Name "Combined.pdf"

        #Find and add pdf files in subfolders
        $_.Group | ForEach-Object {
            #$input = New-Object PdfSharp.Pdf.PdfDocument #I don't think you need this
            $input = $PdfReader::Open($_.fullname, $PdfDocumentOpenMode::Import)            
            $input.Pages | %{ $output.AddPage($_) }
        }

        #Save
        $output.Save($outfilepath)

        #Remove output-object
        Remove-Variable output
    }                      

}