Скрипт Powershell для обработки png через параметры exe при сохранении структуры исходного файла

565
Tim Burton

В настоящее время я работаю над личным проектом, где мне нужно изменить размеры десятков тысяч файлов PNG. Я почти ничего не знаю о сценариях, PS или программировании (я художник-график)

Я использую программу под названием ImageResizer, которая изменяет размеры изображений.

Это программное обеспечение имеет параметры командной строки. Параметры, которые я использую:

/resize auto "XBR 2x <NoBlend>" 

который берет мое изображение и использует алгоритм xBRx2, чтобы удвоить его размер. Именно этот вывод мне нужен.

На самом деле, у меня есть пакетный файл, который я взял с программного обеспечения Github, который делает именно то, что мне нужно, но только для одного изображения. Вот оно, для справки:

@echo off  for %%F in (Input*.*) do ImageResizer-r129.exe /load "%%F" /resize auto "XBR 2x <NoBlend>" /save "Output\%%~nF%%~xF" 

Вот моя дилемма. У меня, как я уже говорил, десятки тысяч этих изображений. И вы можете подумать "хорошо, что cmd может сделать это" ...

За исключением того, что эти png-файлы вложены в довольно обширный макет подкаталога ... и моя выходная папка должна поддерживать ту же компоновку подкаталогов, что и входные данные, чтобы работать с тем, что мне нужно.

Итак, чтобы объяснить, что мне нужно более четко ...

У меня есть папка INPUT. В этой папке несколько подпапок. И в каждой из этих папок есть больше папок ... как далеко они идут и имена этих папок различны. В конце концов, в конце каждой «ветки» находятся мои png-файлы, для обработки которых мне нужно программное обеспечение.

Итак, моя папка ввода выглядит примерно так:

L Входные данные
L_ долото L__
текстуры
L___ элементы
L____ one.png
L____ two.png
L___ модели
L____ one.png
L____ two.png
L_ артефакты L__
текстуры
L___ элементы
L____ groupOne
L_____ one.png
L_____ two.png
L____ groupTwo и
т. Д.

Как вы можете заметить из моего примера, нет единой структуры именования, и из того, что я мало знаю о скриптах, необходим рекурсивный переключатель для захвата всех png-файлов.

Все PNG из этой входной папки должны быть переданы через ImageResizer.exe с моими параметрами.

Затем обработанные файлы PNG необходимо вывести в папку «Выход» с той же разметкой поддиректории SAME, что и для «Input ...»,
поэтому файл «Input / chisel / textures / items / one.png» необходимо / сохранить в файле «Output / chisel / textures / items / one» .png и так далее для каждого png в моей папке Input.

Кроме того, скрипт может просто перезаписать исходное изображение из папки ввода. В любом случае достигается одна и та же цель.

Вот мой текущий сценарий PS, который написал мой зять, но не смог завершить. http://pastebin.com/fveGJkRJ

Любая помощь очень ценится, так как мне нужно обработать около 18000 фунтов. Я начал просто копировать и вставлять свой пакетный скрипт снова и снова, заменяя каждый ввод и вывод каждым путем к файлу, но это потребляло слишком много времени.

0
Извините, я не могу помочь с Powershell, но ищу что-то эквивалентное команде * nix 'find', для которой задача будет тривиальной. Glenn Randers-Pehrson 7 лет назад 0

1 ответ на вопрос

0
LotPings

Вот скрипт powershell, который делает то, что вы хотите.
Поскольку у меня есть проблема с аргументами и цитированием (и без времени), он генерирует необходимые папки и командный файл со всеми аргументами для ImageResizer-r129.exe, вам придется выполнять отдельно.

$ImgRes= "ImageResizer-r129.exe" $Input = "G:\Rebirth Gaming\ImageResizer\input\" $output= "G:\Rebirth Gaming\ImageResizer\Output\"  $Len = $Input.Length  Set-Location $Input  Get-ChildItem *.png -file -recurse| ForEach { $OutPath = $Output+$($_.DirectoryName.Substring($Len)) If (!(Test-Path $OutPath))  "$ImgRes /load `"$_`" /resize auto `"XBR 2x <NoBlend>`" /save `"$OutPath\$($_.Name)`" " } | Out-File $($Output+"Resize.cmd")