PDFTK с Powershell и перемещением элемента в родительский каталог - PullRequest
0 голосов
/ 01 мая 2018

Я использовал приведенный ниже код для объединения всех файлов .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 на сегодняшний день, а ранее я использовал Powershell 2.0, когда пробовал PDFTK с переменными.

1 Ответ

0 голосов
/ 01 мая 2018

[перемещение моего комментария к ответу]

Я предложил, чтобы 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] типа и не содержат файловой системы. знать информацию из ранее в конвейере.

...