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