带有 Powershell 和移动项目到父目录的 PDFTK

PDFTK with Powershell and Move-Item to Parent Directory

我一直在使用下面的代码将每个子目录中的所有 .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。

[将我的评论移至答案]

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

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

您原来的移动项目方法以及您对 $_.Directory.Parent 的尝试没有奏效的原因是您正在使用的 类型 通过您的脚本进行了更改.询问 "what type of thing is this?" 在 PowerShell 中非常重要,因为它的输入非常随意,尤其是在您使用 $_ 的地方,因为名称中没有任何内容可以帮助显示正在发生的事情。 (使用 Get-Member$thing.GetTYpe() 找出某物的类型)。

gci 输出 [system.io.fileinfo] 类型的东西,它们有文件系统信息,如 .Directory.Parent.FullName.DirectoryName 等等。

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

这里:

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

$_.Group是组里的所有东西,$_.Name是组名,属于[string]类型。

$_.Directory.Parent 不起作用,因为 [GroupInfo] 缺少文件系统信息,只有组中的东西有。

你使用 move-item 的第一种方法有同样的问题:

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

$_ 是来自 PDFtk 的每一行文本。我不知道那是什么样子,但它可能是某种 "processing files, found 10 pages, writing output file" 类型的状态消息,所有这些都是 [string] 类型的文本行,并且不携带早期的文件系统感知信息管道。