--shell停止执行,命令提示符,批处理文件,PHP exec()等

时间:2015-07-28 18:48:51

标签: php shell batch-file command-prompt inkscape

我想要什么

我有一个我要执行的命令。当我使用命令提示符手动执行此操作时,一次只能执行一个命令,我没有任何问题。我正在尝试自动化。

我尝试了什么

这是我手动输入命令提示符的内容。我还尝试使用.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的{​​{1}}函数导致文件永远不会完成加载。

我需要什么

它可以是批处理文件,php --shell函数或任何其他方法来完成此命令,只要它可以自动化。请解释一下你的答案,这样我就可以更好地理解执行命令了。

更新:什么工人

感谢这两个答案,以帮助解决这个问题。

在inkscape中,我必须在名为exec()的{​​{1}}中创建一个文件夹,并在该文件夹中放置一个名为Inkscape/share/icons的空文件。然后,我必须纠正我的语法。

hicolor

2 个答案:

答案 0 :(得分:2)

查看文档, - shell仅用于交互式使用,就像您在终端中输入一样。尝试删除此标志。您需要CLI程序以非交互模式在命令行上执行,以便从PHP触发它。

以下是选项:https://inkscape.org/en/doc/inkscape-man.html

答案 1 :(得分:1)

我不能在这里谈论任何特定于Windows的行为,但是...... Inkscape的--shell选项可以从标准输入中获取命令。如果在您的环境中它与在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)管道 stdout 强>标准输入即可。

或者,如果您使用bash作为shell,则另一种表示法可能是:

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

这可能更容易阅读,因为它将重要命令放在行的开头。 <<<告诉bash“获取以下字符串,并将其提供给前面的命令”或其附近。

要把它放到PHP exec()中,我建议使用第一种表示法,因为我不知道你的Windows环境是使用bash还是其他shell执行命令行。

在Windows shell中尝试上面的“echo”行,看看会发生什么。它可能只是工作。我什么都不保证。 : - )

您的最终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,可能含有坚果。但也许它会有所帮助。 ; - )

<强>更新

看了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));