Пакетный вызов S3Express, передача команды, цикл

У меня есть файл .bat, который применит несколько быстрых преобразований ImageMagick к большой коллекции подкаталогов. Мне нужно, чтобы этот скрипт также отправлял выходные файлы в AWS S3 с помощью утилиты S3Express (вариант S3cmd для Windows).

echo off
set dest=destination-bucket/testfolder/
for /D %%d in (*) do (
    cd %%d
    ​​md small
    convert %1 -resize 350x350 -quality 80 -strip ./small/image.jpg
    md medium
    convert %1 -resize 640x640 -quality 80 -strip ./medium/image.jpg
    md large
    convert %1 -resize 1080x1080 -quality 30 -strip ./large/image.jpg
    md xlarge
    convert %1 -resize 1440x1440 -quality 30 -strip ./xlarge/image.jpg
    cd..
    "C:\Program Files\S3Express\S3Express.exe"
    put %%d %dest% -s -cacl:public-read -cond:"name matches 'image.jpg'"
    REM -s    == recursive (replicates subfolder structure)
    REM -cacl == canned access control list (ACL) :: Everyone gets READ access
    REM -cond == filter :: only pushes "image.jpg" files.
)

Названный как «conv.bat», я бы запустил его как «conv image.jpg».

Проблема возникает с командой "put", которая представляет собой команду S3Express.

Как я могу заставить свой скрипт подключать команду put к S3Express в конце каждого цикла? В своем текущем состоянии сценарий проходит через цикл один раз и останавливается после открытия «S3Express.exe».

Возможно, важно отметить, что это мой первый пакетный скрипт, и я впервые использую S3Express.


person muad-dweeb    schedule 06.01.2015    source источник
comment
Кстати, вы можете сделать md small med large xlarge одним выстрелом, а не стрелять 4 раза. Вы также можете сделать все свои мгновенные сообщения converts одним кадром и сэкономить много времени, если у вас много изображений... convert %1 -strip \( +clone -resize 350x350 -quality 80 -write small/image.jpg \) \( +clone -resize 640x640 -quality 80 -write med/image.jpg \) ... -resize 1440x1440 -quality 30 large/image.jpg   -  person Mark Setchell    schedule 07.01.2015
comment
@MarkSetchell Эй, спасибо за строчку «md», это действительно круто. Что касается сжатия ImageMagick, будет ли более функциональным и/или быстрым запуск «конвертировать» только один раз? На мой взгляд, это не так читабельно, но если есть прирост производительности, я бы выбрал это.   -  person muad-dweeb    schedule 08.01.2015
comment
Если у вас есть большое количество изображений, это может иметь большое значение. Если всего дюжина или две, используйте удобочитаемую версию.   -  person Mark Setchell    schedule 08.01.2015


Ответы (1)


Я предполагаю, что вы пытаетесь запустить S3Express.exe и ввести команду put. Как вы обычно делаете в командной строке. Однако, когда вы вызываете S3Express.exe, вы вызываете новый процесс в том же окне — все последующие команды не будут выполняться, пока этот процесс не завершится.

Изучив некоторую документацию по S3Express, я думаю, вы сможете сделать следующее - все на одной строке.

"C:\Program Files\S3Express\S3Express.exe" "put %%d %dest%" -s -cacl:public-read -cond:"name matches 'image.jpg'" -exit

-exit в конце означает, что вы не застряли в контексте S3Express после запуска команды, и ваш цикл должен продолжаться.

Я не уверен, как кавычки (после расширения переменной) будут работать в части "put %%d %dest%" - согласно документации вам нужно экранировать кавычки с помощью \. Возможно, вам придется заменить его чем-то вроде следующего "put \"%%~d\" \"%dest%\"".

person unclemeat    schedule 06.01.2015