繁体   English   中英

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

[英]--shell stops execution, for Command Prompt, Batch files, PHP exec(), and more

我想要的是

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

我尝试过的

这是我在命令提示符下手动键入的内容。 我也尝试过使用.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

没有--shellexec函数导致文件永远无法完成加载。

我需要的

它可以是批处理文件,php exec()函数或任何其他可以完成此命令的方法,只要它可以自动化即可。 请解释您的答案,以便我更好地理解执行命令。

更新:什么工人

感谢这两个答案为您解决这个问题提供了帮助。

在inkscape中,我必须在Inkscape/share/icons创建一个名为hicolor文件夹,然后在该文件夹中放置一个名为index.theme的空文件。 然后,我不得不更正我的语法。

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

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

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

在这里,我无法谈论任何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

效果是您采用了一个字符串 ,然后回显了它..但是您通过接受stdin的命令( 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可能包含坚果。 但也许有帮助。 ;-)


更新:

看完Inkscape手册页后 ,您似乎可以通过纯命令行来处理此问题,而无需使用pipe和--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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM