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

Другие вопросы по тегам