2015-07-28 7 views
2

Что я хочу--shell останавливает выполнение, для командной строки, пакетная обработка файлов, PHP Exec(), и более

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

То, что я пытался

Вот что я печатаю вручную в командной строке. Я также попытался использовать файл .bat.

cd c:/Program Files/Inkscape 
inkscape --shell 
c:/wamp/www/i/t1.svg --export-png=c:/wamp/www/i/r1.png --export-dpi=900 

Произошла попытка использования php exec().

exec('cd c:/Program Files/Inkscape && inkscape --shell && c:/wamp/www/i/t1.svg --export-png=c:/wamp/www/i/r1.png --export-dpi=900'); 

Что происходит

Отладка с помощью echo, то ясно, что --shell вызывает исполнение остановить. При запуске командного файла пакет закрывается этой командой. При запуске php exec() больше команд не будет работать после вызова этой команды. Когда я запускаю эту команду вручную по командной строке, я получаю этот ответ.

Inkscape 0.91 r13725 interactive shell mode. Type 'quit' to quit. 

После этого я могу выполнить следующую команду, которую мне нужно запустить. Однако я не могу запустить эту команду.

inkscape --shell && c:/wamp/www/i/t1.svg --export-png=c:/wamp/www/i/r1.png --export-dpi=900 

я получаю тот же ответ, и действия после --shell не принимаются.

Когда я удалил --shell как из пакетного файла, он дает мне ошибку Inkscape

(inkscape.exe:11912): Gtk-WARNING **: Could not find the icon 'object-visible'. 
The 'hicolor' theme was not found either, perhaps you need to install it. 
You can get a copy from: 
http://icon-theme.freedesktop.org/releases 
(inkscape.exe:11912): Gdk-CRITICAL **: inner_clipboard_window_procedure: assertion 'success' failed 

exec функцию без --shell результатов в файле, чтобы никогда не закончить погрузку.

Что мне нужно

Это может быть пакетный файл, PHP exec() функция, или любой другой способ, чтобы выполнить эту команду, до тех пор, как он может быть автоматизирован. Пожалуйста, объясните свой ответ, чтобы я мог лучше понять выполнение команд.

Update: Какие рабочие

Благодарности к обоим ответам за помощь в выяснить это.

В inkscape мне пришлось создать папку в Inkscape/share/icons с именем hicolor, и в этой папке поместите пустой файл с именем index.theme. Затем мне пришлось исправить свой синтаксис.

cd c:/Program Files/Inkscape && inkscape --file=t1.svg --export-eps=r1.eps --export-dpi=900) 
+0

Фрагмент «интерактивный режим оболочки» довольно очевиден. Вы хотите, чтобы Inkscape был * не * интерактивным, так как вас не будет, чтобы попасть на клавиатуру. –

+0

IIRC, интерактивный режим принимает команды от stdin. Мой ответ ниже дает возможное решение, которое использует это, хотя я понятия не имею, будет ли оно работать в Microsoft Windows. – ghoti

ответ

1

Я не могу говорить с любой Windows, определенное поведение здесь, но ... --shell вариант Inkscape может принимать команды из стандартного ввода. Если это будет работать так же, как в системе Unix, тогда может быть простое решение.

Во-первых, обратите внимание на обозначение, которое вы использовали в вашем exec():

commandone && commandtwo 

Это не то же самое, введя одну строку (commandone), а затем ввести другую линию (commandtwo). Вместо этого он запускает commandone, и если он завершает (завершает) успешно, запустите commandtwo. Это явно не то, что вы хотите.

Вместо этого в среде Unix, вы можете попробовать что-то вроде этого:

echo "somestring" | commandone 

Это делает «SomeString» на вход в «commandone», как если бы вы ввели его в терминал. В вашем случае, это может выглядеть примерно так:

echo "c:/wamp/www/i/t1.svg --export-png=c:/wamp/www/i/r1.png --export-dpi=900" | inkscape --shell 

Эффекта является то, что вы принимаете строку, и эхо его .. но конвейер стандартного вывод через команду (inkscape --shell), который принимает stdin.

Попеременно, если вы используете bash в качестве оболочки, другое обозначение может быть:

inkscape --shell <<<"c:/wamp/www/i/t1.svg --export-png=c:/wamp/www/i/r1.png --export-dpi=900" 

Это, возможно, легче читать, в том, что она ставит важную команду в начале строки. <<< сообщает bash, чтобы «взять следующую строку и передать ее предыдущей команде» или около нее.

Чтобы поместить это в PHP exec(), я бы рекомендовал использовать первую нотацию, потому что я понятия не имею, использует ли ваша среда Windows bash или какая-либо другая оболочка для выполнения командных строк.

Попробуйте использовать строку «эхо» в оболочке Windows и узнайте, что произойдет. Он может просто работать. Я ничего не гарантирую. :-)

Ваш окончательный PHP код может выглядеть примерно так:

$inkscape="c:/Program Files/Inkscape/Inkscape --shell"; 
$cmd="c:/wamp/www/i/t1.svg --export-png=c:/wamp/www/i/r1.png --export-dpi=900"; 

exec(sprintf("echo '%s' | %s", $cmd, $inkscape), $output, $retval); 
if ($retval!==false) { 
    print "Success!\n"; 
} 

Излишне говорить, что это не проверялось, YMMV, может содержать орехи. Но, возможно, это помогает. ;-)


UPDATE:

После посмотрев на the Inkscape man page, это выглядит, как вы могли бы справиться с этим с помощью чистой командной строки без необходимости трубы и --shell.

Как насчет этого?

exec("c:/Program Files/Inkscape/Inkscape --file=c:/wamp/www/i/t1.svg --export-png=c:/wamp/www/i/r1.png --export-dpi=900", $output, $retval); 

if ($retval>0) 
    printf("ERROR (%d): %s\n", $retval, implode("\n", $output)); 

?

+0

Определенно стоит попробовать. Вы пропустили половину двоеточия во второй строке вашего последнего фрагмента кода. В любом случае, я на самом деле пытаюсь запустить это в среде Windows и среде Linux. В среде Windows код, похоже, вообще не работает, но в linux он дает успех, но возвращает код linux 127, который не может найти команду. Я переписал вашу строку как «exec (sprintf (« echo »% s '|% s», $ cmd, $ inkscape), $ output, $ retval); 'и теперь получить 126, найденный, но не может быть выполнен. Я буду рыться в нем и посмотреть, что я могу получить. – Goose

+0

Полуколона добавлена, спасибо. Удачи! :-) – ghoti

+0

Также добавлен вариант с чистой командной строкой, который выглядит так, как будто он должен работать. Я не думаю, что вам нужно '-shell'. Конечно, это все еще непроверено с моей стороны. – ghoti

2

Посмотрите на документы, --shell для интерактивного использования, только если вы печатаете на терминале. Попробуйте удалить этот флаг. Вам нужна ваша программа CLI для выполнения в командной строке в неинтерактивном режиме, чтобы вызвать ее из PHP.

Вот варианты: https://inkscape.org/en/doc/inkscape-man.html

+0

Я попытался удалить '--shell' как из командного файла, так и из функции' exec() '. Пакетный файл дает ошибку inkscape '(inkscape.exe: 11912): Gtk-WARNING **: Не удалось найти значок« объект-видимый ». Тема «hicolor» также не найдена, возможно, вам необходимо установить ее. Вы можете получить копию от: http://icon-theme.freedesktop.org/releases (inkscape.exe: 11912): Gdk-ВАЖНЫЙ **: inner_clipboard_window_procedure: asserti на 'успех' failed'. Я займусь этим. Функция 'exec' приводит к загрузке файла навсегда. – Goose

+1

Получена ли эта ошибка при запуске командного файла в командной строке? Это похоже на ошибку в inkscape: https://bugs.launchpad.net/inkscape/+bug/1329990 –

+0

Это так. Я не уверен, что это значит. В настоящее время я заменяю отсутствующие файлы по одному. Не знаете, сколько есть, или если это исправит проблему. Есть ли способ предотвратить это предупреждение от остановки программы? – Goose