带有Powershell和Move-Item到父目录的PDFTK

时间:2018-04-30 21:53:34

标签: powershell powershell-v4.0 pdftk

我一直在使用以下代码将每个子目录中的所有.pdf文件合并为一个pdf。它将新组合的pdf保存在子文件夹中作为子文件夹名称。哪个好,但是我必须手动将所有新创建的文件移出到父文件夹。这是当前的代码:

$pdftk = "C:\SymLinks\Combine\pdftk.exe"
$inputFolder = "I:\Fort Gibson-DONE"
gci $inputfolder -r -include *.pdf | sort-object | group DirectoryName | % {& $PDFtk $_.group CAT OUTPUT "$($_.Name)\$($_.Name | Split-Path -Leaf).pdf" verbose}

我已尝试使用以下方式输出Move-Item:

$pdftk = "C:\SymLinks\Combine\pdftk.exe"
$inputFolder = "I:\Fort Gibson-DONE"
gci $inputfolder -r -include *.pdf | sort-object | group DirectoryName | % {& $PDFtk $_.group CAT OUTPUT "$($_.Name)\$($_.Name | Split-Path -Leaf).pdf" verbose} | % {mv $_.FullName $_.Directory.Parent.FullName }

但它不起作用。它说:

Move-Item : Cannot bind argument to parameter 'Path' because it is null.
At I:\CombineFortGibson.ps1:3 char:170
+ ... rbose} | % {mv $_.FullName $_.Directory.Parent.FullName }
+                    ~~~~~~~~~~~
+ CategoryInfo          : InvalidData: (:) [Move-Item], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.MoveItemCommand

我不确定如何将新创建的PDF移到父文件夹中。

我觉得我需要将$ .FullName和$ .Directory.Parent.FullName存储到变量中,然后将这些变量提供给move-item。但我不知道该怎么做。变量似乎不能很好地与pdftk一起使用。

我现在使用的是Powershell 4.0,之前我在使用变量尝试PDFTK时使用的是Powershell 2.0。

1 个答案:

答案 0 :(得分:1)

[将我的评论移至答案]

我建议让PDFtk将输出文件写入您想要的位置,而不是将其放在其他位置然后移动它,例如改为:

OUTPUT "$($_.Name | Split-Path -Parent)\$($_.Name | Split-Path -Leaf).pdf"

您的原始移动项目方法以及$_.Directory.Parent尝试无效的原因是因为您正在处理的类型通过您的脚本进行更改。质疑"这是什么类型的东西?"在PowerShell中非常重要,因为它在打字方面非常随意,特别是在您使用$_时,因为名称中没有任何内容可以帮助显示正在发生的事情。 (使用Get-Member$thing.GetTYpe()找出什么类型的东西。

gci输出[system.io.fileinfo]类型的内容,它们包含.Directory.Parent.FullName以及.DirectoryName等文件系统信息。

group DirectoryName输出[GroupInfo]个容器,每个容器一个。该类型没有文件系统部分,只有组的名称和组中的内容。

下面:

$PDFtk $_.group CAT OUTPUT "$($_.Name)\..

$_.Group是群组中的所有内容,$_.Name是群组名称,为[string]类型。

$_.Directory.Parent无法正常工作,因为[GroupInfo]缺少文件系统信息,只有组中的内容具有此功能。

move-item的第一种方法存在同样的问题:

| % {mv $_.FullName $_.Directory.Parent.FullName }

$_是来自PDFtk的每一行文字。我不知道它看起来像什么,但它可能是某种处理文件,找到10页,写出输出文件"一种状态消息,所有这些消息都是[string]类型的文本行,并且不会从管道中的早期传送文件系统感知信息。