С этой проблемой я сталкивался много раз, особенно при использовании собственных команд, созданных на Python.
Например, сегодня у меня есть серия изображений (около 700), и я хотел бы взять эти изображения и передать их встроенной команде img2pdf, чтобы вывести один PDF-документ.
Фрагмент путей к изображениям:
C:\Users\ralf\Documents\raw scans\volume 39\chapter 1\Page_1.png
C:\Users\ralf\Documents\raw scans\volume 39\chapter 1\Page_2.png
C:\Users\ralf\Documents\raw scans\volume 39\chapter 1\Page_3.png
C:\Users\ralf\Documents\raw scans\volume 39\chapter 1\Page_4.png
C:\Users\ralf\Documents\raw scans\volume 39\chapter 1\Page_5.png
C:\Users\ralf\Documents\raw scans\volume 39\chapter 1\Page_6.png
C:\Users\ralf\Documents\raw scans\volume 39\chapter 1\Page_7.png
...
C:\Users\ralf\Documents\raw scans\volume 39\chapter 1\Page_687.png
и команда:
$images = get-childitem -path 'C:\Users\ralf\Documents\raw scans\volume 39\chapter 1' | sort creation time
Img2PDF $images -o "chapter1.pdf"
но вышеизложенное терпит неудачу:
ResourceUnavailable: Program 'img2pdf.exe' failed to run: An error occurred trying to start process 'C:\Users\ralf\AppData\Local\Programs\Python\Python311\Scripts\img2pdf.exe' with working directory 'C:\Users\ralf\Documents\raw scans\volume 39\chapter 1'. The filename or extension is too long.At line:1 char:1
Если я просто передам пути для первых пяти изображений, команда сработает и документ будет создан. Иногда мне даже удается заставить его работать
c:\temp\Page_1.png
, c:\temp\Page_2.png
и т. д.image2pdf
и проходим новые пути.Много раз я пытался решить эту проблему, однажды я последовал этому руководству и включил LongPathsEnabled в своем реестре, но после перезапуска это не дало никакого эффекта. он даже сейчас включен.
Эта проблема продолжает возникать в самые критические времена, и мне бы очень хотелось хоть раз с ней разобраться, спасибо за любую помощь.
Простите, я хотел использовать свойство CreationTime
, которое, по моему мнению, соответствует столбцу «Дата создания» в проводнике. Также PowerShell правильно передаст свойство FullName
собственной команде. Что касается -file
, я уверен, что в каталоге есть только файлы, но это хороший сигнал для тех, кто может найти эту страницу полезной позже.
попробуйте добавить ` \\?\ ` к путям перед переходом к img2pdf
Думаю, у меня есть простое решение, которое вы можете попробовать. Подключите диск к своей папке, обработайте файлы на основе подключенного диска, удалите сопоставление.
$tmpDrive = New-PSDrive -Name G -PSProvider FileSystem -Root 'C:\Users\ralf\Documents\raw scans\volume 39\chapter 1' -Persist
$images = get-childitem -path G:\ | sort LastWriteTime
Img2PDF $images -o "chapter1.pdf"
$tmpDrive | Remove-PSDrive
*Спасибо phuclv за предложение добавить -Persist
.
Я попробовал это, в конечном итоге выдает ту же ошибку, о которой я упоминал в ОП. Это очень умное решение, но кажется, что попытка получить элементы на «PsDrive» просто возвращает путь, который разрешается в фактический «физический» путь. Выполнение get-childitem g:\ |% fullname
возвращает пути, начинающиеся с C:\Users\ralf\...
, а не с `g:`. Мне бы хотелось, чтобы это сработало, я мог бы придумать сотни вариантов его использования, лол.
вам может понадобиться -Persist
, чтобы сделать его более похожим на subst
в cmd или на подключенный диск в проводнике: New-PSDrive -Name G -PSProvider "FileSystem" -Root 'C:\Users\ralf\Documents\raw scans\volume 39\chapter 1' -Persist
. Но еще лучше, если вы создадите отдельный раздел и смонтируете его в папку NTFS или создадите символическую ссылку на другую папку
@phuclv с опцией -persist
мне удалось это сделать. Я отметил это как ответ, хотя в нем ответ -persist
отсутствует. Возможно, TheMadTechnician отредактирует свой ответ, включив в него -persist
. В любом случае, спасибо вам обоим, я тоже учту предложение о папке/символической ссылке NTFS!
Я думаю, вам нужно отправить ему полный путь и имена файлов, а не объекты fileinfo. Попробуйте
Img2PDF $images.FullName
. а еще недвижимости нетcreation time
.. Вы имели в видуLastWriteTime
наверное? P.S. лучше также добавить переключатель-File
к команде Get-ChildItem, чтобы исключить каталоги, которые он также может найти