Я использовал приведенный ниже код, чтобы объединить все файлы .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 с переменными.
Круто :) Я переместил свой комментарий к полному ответу с дополнительным объяснением причины, если вы хотите отметить его как «отвеченный» с помощью галочки.
@ AmandaKay10 Если ответ подходит вам, вы должны принять его, поставив отметку или проголосовав за него.
[перемещение моего комментария к ответу]
Я предложил, чтобы 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]
и не несут никакой информации о файловой системе. из более раннего в конвейере.
В этом есть смысл. Спасибо!
@TessellatingHeckler Ранее я пробовал это с помощью $ _. Directory.Parent), и это не сработало, но ваш метод работает! Большое спасибо!