簡體   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