PDFTK с Powershell и перемещением элемента в родительский каталог
Я использовал приведенный ниже код, чтобы объединить все файлы.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 с сегодняшнего дня, а ранее я использовал Powershell 2.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]
печатать строки текста и не переносить информацию о файловой системе, полученную ранее в конвейере.