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 с переменными.

@TessellatingHeckler Ранее я пробовал это с помощью $ _. Directory.Parent), и это не сработало, но ваш метод работает! Большое спасибо!

AmandaKay10 01.05.2018 00:48

Круто :) Я переместил свой комментарий к полному ответу с дополнительным объяснением причины, если вы хотите отметить его как «отвеченный» с помощью галочки.

TessellatingHeckler 01.05.2018 02:09

@ AmandaKay10 Если ответ подходит вам, вы должны принять его, поставив отметку или проголосовав за него.

user6811411 01.05.2018 15:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
393
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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] и не несут никакой информации о файловой системе. из более раннего в конвейере.

В этом есть смысл. Спасибо!

AmandaKay10 04.05.2018 21:27

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