通过文件夹递归时,Powershell将文件保存在原始文件夹中

时间:2018-10-02 15:13:20

标签: powershell

我正在尝试使用在此处找到的Powershell脚本将PDF文件转换为TIFF文件。我大部分的脚本都在工作,但是我似乎无法弄清楚如何将TIFF文件保存在PDF所在的原始文件夹中。

#Path to your Ghostscript EXE
$tool = 'C:\Program Files\gs\gs9.25\bin\gswin64c.exe'

#Directory containing the PDF files that will be converted
$inputDir = 'C:\Temp\Test_ED_Data\1\'

#Output path where converted PDF files will be stored
$outputDirPDF = 'C:\Temp\PDF_Out\'

#Output path where the TIFF files will be saved
$outputDir = $inputDir

$pdfs = get-childitem $inputDir -recurse | where {$_.Extension -match "pdf"}

foreach($pdf in $pdfs)
{
    $tif = $outputDir + $pdf.BaseName + ".tiff"
    if(test-path $tif)
    {
        "tif file already exists " + $tif
    }
    else        
    {   
        'Processing ' + $pdf.Name        
        $param = "-sOutputFile=$tif"
        & $tool -q -dNOPAUSE -sDEVICE=tiffg4 $param -r300 $pdf.FullName -c quit
    }
    Move-Item $pdf $outputDirPDF
}

脚本运行后,所有PDF都显示在原始输入目录中,而不显示在任何子目录中。

因此,例如,如果C:\ Temp \ Test_ED_Data \ 1 \中包含1个PDF,它将转换为TIFF并保存在C:\ Temp \ Test_ED_Data \ 1 \中,但是子目录(如C:\ Temp \ Test_ED_Data \ 1 \ Progress \也保存在C:\ Temp \ Test_ED_Data \ 1的原始子目录中。

如何获取此脚本,以确保将转换后的文件保存在从中检索到的目录中?当Powershell引用节$outputDir = $inputDir时,好像不记得递归的路径。我该怎么做才能纠正这个问题?

谢谢。

2 个答案:

答案 0 :(得分:2)

因此快速浏览一下脚本显示

$outputDir = $inputDir

而且

$pdfs = get-childitem $inputDir -recurse | where {$_.Extension -match "pdf"}

这基本上意味着在$ inputDir中找到所有带有PDF扩展名的文件,并搜索$ inputDir中的所有其他文件夹。但是您保存的是$ inputDir

的静态位置

试一下

function CovertPDF-TIFF($InputDirectory, $OutputPDFLocation){     
    $tool = 'C:\Program Files\gs\gs9.25\bin\gswin64c.exe'
    get-childitem $InputDirectory -include "*.pdf" -recurse | %{
        $tiff = "$($_.Directory)\$($_.BaseName).tiff"
        if(test-path $tiff)
        {
            "tiff file already exists " + $tiff
        }
        else        
        {   
            'Processing ' + $_.Name        
            $param = "-sOutputFile=$tiff"
            & $tool -q -dNOPAUSE -sDEVICE=tiffg4 $param -r300 $_.FullName -c quit
        }
        Move-Item $pdf $OutputPDFLocation
    }
}

CovertPDF-TIFF -InputDirectory C:\Temp\Test_ED_Data\1\ -OutputPDFLocation C:\Temp\PDF_Out\

这里发生的是管道。基本上,管道是您获取输出并将其推送到另一个命令的地方,管道的符号为 |

Get-ChildItem 中,我们将包括所有以 *。pdf

结尾的文件

我们将 | 每个项目通过管道传送到每个对象,也称为 在那里,我们创建了一个变量 $ Tiff ,用于根据找到的PDF存储调用tiff的位置和名称。在管道中, $ _ 是用于管道传输的信息的变量(在这种情况下,其为“子项信息”,也称为PDF文件信息)。在powershell中, $()可让您向字符串或另一个称为表达式的命令添加单独的命令,其专有名称为 Sub Expression 。因此, $ Tiff 保留子项目录的字符串,然后添加子项文件名,然后在末尾添加.tiff。 然后,它使用命令 Test-Path 检查该项目是否存在。 如果是,则返回一条消息。如果没有,它将创建参数并运行gswin64c.exe可执行文件。在其中一个参数中,您将看到 -sOutputFile = $ tiff 。在这里,我们定义了保存新Tiff文件的位置。最后,通过 Move-Item

将PDF文件移动到新位置

答案 1 :(得分:0)

您需要做的就是交换此行:

$tif = $outputDir + $pdf.BaseName + ".tiff"

与此:

$tif = $pdf.FullName -Replace $pdf.Extension,".tiff"