Можно использовать эти Повышение. Библиотека Process . Это не официально часть Повышения все же. Я видел, что он работает приятно на других. К сожалению, boost.process прогресс, по-видимому, был остановлен. pstreams является другим (по-видимому активным) проектом. Конечно, стоящий попытки я сказал бы - но это только для совместимых операционных систем POSIX.
Да, конечно, это возможно. При перетаскивании нескольких файлов в пакетный файл вы получаете список отброшенных файлов в виде списка, разделенного пробелами. Вы можете проверить это с помощью следующего простого пакета:
@echo %*
@pause
Теперь у вас есть две возможности:
PngCrush уже может обрабатывать несколько имен файлов, заданных ему в командной строке. В этом случае все, что вам нужно сделать, это передать % *
в PngCrush вместо просто % 1
(как вы, вероятно, делаете сейчас):
@pngcrush% *
% *
содержит все аргументы командного файла, поэтому это удобный способ передать все аргументы другой программе. Однако будьте осторожны с файлами, названными как параметры PngCrush. Вундеркинды UNIX знают об этой проблеме: -)
Однако после прочтения вашего сообщения, описывающего вашу технику, это не будет работать должным образом, так как вы записываете сжатый файл в new.png
. Плохая идея, если вы обрабатываете сразу несколько файлов, так как может быть только один new.png
:-). Но я только что опробовал, что PngCrush отлично справляется с несколькими файлами, поэтому, если вы не против обновления файлов на месте, поставьте
@pngcrush -reduce -brute% *
в вашем пакете выполнит работу (в соответствии с вашей исходной статьей).
PngCrush не будет обрабатывать несколько файлов или , которые вы хотите записать в новый файл после сжатия. В этом случае вы придерживаетесь процедуры «по одному файлу за раз», но перебираете входные аргументы. В этом случае проще всего построить небольшой цикл и сдвигать
аргументы каждый раз, когда вы его обрабатываете:
@echo off
если [% 1] == [] goto: eof
: loop
pngcrush -reduce -brute% 1 "% ~ dpn1_new% ~ x1"
сдвиг
если нет [% 1] == [] цикл перехода
То, что мы делаем здесь, просто: сначала мы пропускаем весь пакет, если он выполняется без аргументов, затем мы определяем метку для перехода: loop
. Внутри мы просто запускаем PngCrush с первым аргументом, давая сжатому файлу новое имя. Вы можете прочитать синтаксис анализа пути, который я использовал здесь в вызове справки
. В основном то, что я делаю здесь, - это наименование файла точно так же, как и раньше; Я просто вставляю "_new" в конец имени файла (перед расширением). % ~ dpn1
заменяется на диск, путь и имя файла (без расширения), а % ~ x1
заменяется на расширение, включая точку.
ETA: Eep , Я просто прочитал желаемый результат с помощью new.png, new (1) .png и т. Д. В этом случае нам не нужно никаких причудливых разборов пути, но у нас есть другие проблемы, о которых нужно позаботиться. если [% 1] == [] goto: eof установить n = 0 : loop если% n% == 0 ( pngcrush -reduce -brute% 1 new.png ) еще ( pngcrush -reduce -brute% 1 новый ^ (% n% ^). png ) сдвиг установить / a n + = 1 если нет [% 1] == [] цикл перехода
% n%
здесь наш счетчик, и мы обрабатываем случай, когда n
равно 0, записывая результат в new.png
вместо new ( 0) .png
.
Однако у этого подхода есть проблемы. Если уже есть файлы с именами new.png
или new (x) .png
, то вы, вероятно, их уничтожите. Не хорошо. Поэтому нам нужно сделать что-то другое и проверить, можем ли мы действительно использовать имена файлов:
rem check for new.png
если существует new.png (установить n = 1) else (установить n = 0 и перейти к циклу)
rem проверить наличие пронумерованных новых (x) .png
: checkloop
если не существует new ^ (% n% ^). png goto loop
установить / a n + = 1
перейти к контрольной петле
Остальная часть программы остается прежней, включая обычный цикл. Но теперь мы начинаем с первого неиспользуемого имени файла и избегаем перезаписи файлов, которые уже есть.
Не стесняйтесь при необходимости адаптироваться.