带有Powershell的PDFTK并将项目移动到父目录
我一直在使用下面的代码将每个子目录中的所有.pdf文件合并成一个pdf。它将新的组合pdf保存在子文件夹中作为子文件夹名称。这很好,但是我必须手动将所有新创建的文件移出父文件夹。以下是当前代码:带有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 | %
$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 }