【问题标题】:PDFTK with Powershell and Move-Item to Parent DirectoryPDFTK 与 Powershell 和 Move-Item 到父目录
【发布时间】:2018-04-30 21:53:34
【问题描述】:

我一直在使用以下代码将每个子目录中的所有 .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 存储到一个变量中,然后将这些变量提供给移动项目。但我不知道该怎么做。变量似乎不适用于 pdftk。

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

【问题讨论】:

  • @TessellatingHeckler 我之前曾尝试过使用 $_.Directory.Parent) 并没有用,但你的方法有效!非常感谢!
  • 酷 :) 我已将我的评论移至完整答案,如果您想用勾号将其标记为“已回答”,我将进一步解释原因。
  • @AmandaKay10 如果答案适合您,您应该通过勾选标记和/或投票来接受。

标签: powershell powershell-4.0 pdftk


【解决方案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] 类型的文本行,并且不携带文件系统-来自管道早期的感知信息。

【讨论】:

  • 这是有道理的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多