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

带有Powershell的PDFTK并将项目移动到父目录,powershell,powershell-4.0,pdftk,Powershell,Powershell 4.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 | %

我一直在使用下面的代码将每个子目录中的所有.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}
我已尝试通过以下方式向外移动项目:

$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存储到一个变量中,然后将这些变量输入到移动项中。但我不知道该怎么做。变量似乎不太适合pdftk


从今天起,我使用的是Powershell 4.0,之前我在尝试使用变量PDFTK时使用的是Powershell 2.0

[将我的评论移至答案]

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

OUTPUT "$($_.Name | Split-Path -Parent)\$($_.Name | Split-Path -Leaf).pdf"
最初的移动项目方法以及尝试使用
$\Directory.Parent
失败的原因是您正在使用的类型在脚本中发生了更改。在PowerShell中,询问“这是什么类型的东西?”非常重要,因为它对键入非常随意,尤其是在使用
$\uuuu
的情况下,因为名称中没有任何东西可以帮助显示正在发生的事情。(使用
Get Member
$thing.GetTYpe()
找出某物的类型)

gci
输出
[system.io.fileinfo]
键入内容,它们有文件系统信息,如
.Directory.Parent
.FullName
.DirectoryName

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

在这里:

$\.Group
是组中的所有内容,
$\.Name
是组名,作为
[string]
类型

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

您使用
移动项目的第一种方法
也有同样的问题:

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

$\
是从PDFtk输出的每一行文本。我不知道这是什么样子,但可能是某种“处理文件,找到10页,编写输出文件”的状态消息,所有这些都是
[string]
类型的文本行,并且不携带管道中早期的文件系统感知信息。

@TessellatingHeckler我以前曾尝试使用$\u.Directory.Parent)这样做,但没有效果,但您的方法有效!非常感谢你!酷:)我已经把我的评论移到了一个完整的答案,并解释了为什么,如果你想用勾号将其标记为“已回答”。@AmandaKay10当答案对你有效时,你应该通过勾选标记和/或投票来接受。这是有道理的。非常感谢。
| % {mv $_.FullName $_.Directory.Parent.FullName }