我一直在使用以下代码将每个子目录中的所有.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。
答案 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]
类型的文本行,并且不会从管道中的早期传送文件系统感知信息。