我想要什么
我有一个我要执行的命令。当我使用命令提示符手动执行此操作时,一次只能执行一个命令,我没有任何问题。我正在尝试自动化。
我尝试了什么
这是我手动输入命令提示符的内容。我还尝试使用.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
答案 0 :(得分:2)
查看文档, - shell仅用于交互式使用,就像您在终端中输入一样。尝试删除此标志。您需要CLI程序以非交互模式在命令行上执行,以便从PHP触发它。
答案 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));