5

QProcess に非常に奇妙な問題があり、奇妙な動作です。

最後に取得したいのは次のようなものです(これはWindows 7のcmd.exeです)

C:\path_to_somewhere>cmd /c "C:\Program Files\path_to_dir\executable"

(cmd は QProcess の show との互換性のためのものです)

そのようなことをするために、私はこれを作成します:

QProcess proc;
QString command;
QStringList attributes;

command = "c:\\windows\\system32\\cmd.exe";
QStringList << QString("/c \"C:\\Program Files\\path_to-dir\\executable"");
proc.start(command, attributes);

エラー出力で得られるものは次のとおりです。

Name '\"c:\Program Files\Quantum GIS Wroclaw\bin\gdalwarp.exe\"' is not recognized as
internat or external command, executable or batch file.

(ポーランド語から私が翻訳したものなので、英語では少し異なる場合があります)。

\ 文字は文字列内でエスケープされていないようで、コマンドの文字として \" を残しています。何が間違っていますか?

私は試してみました

proces.start(QString) 

トリプル \"\"\" を使用しても機能しません。この問題の解決策は、私がそれについて考えないほど簡単でなければならないと思います。

4

2 に答える 2

3

OK、それが Qt のバグかどうかはわかりませんが、それに関するドキュメントvoid QProcess::start(QString, QStringList, OpenMode)には次のように書かれています。

Windows: スペースを含む引数は引用符で囲みます。

私のプログラムはスペースを含むパスを使用し、cmdシェルがそこで壊れているため、そうではないようです。

しかし、1 つの文字列のみの引数を受け入れるシステム用に設計された関数を見つけました (Windows のように)。

これはQProcess::setNativeArguments(QString)

これは、特に Windows と Symbian 用に作成された、1 つの QString を引数として受け入れます。

結局のところ、Windows (または Symbian) で引数をシステムに渡す際に問題がある場合は、setNativeArguments(QString).

于 2012-10-07T22:35:26.157 に答える
2

すでに述べたように、Qtはスペースを含む引数を引用符で囲みます。つまり、によって発行される実際のコマンドは次のQProcessようになります(内側の引用符についてはわかりません)。

c:\windows\system32\cmd.exe "/c \"C:\Program Files\path_to_dir\executable\""

これはあなたが望むものではありません:文字列全体がインクルードに渡されcmdます/c。とパスは2つの引数であるため、スペースを気にせず/cに別々にに渡す必要があります。スペースは自動的に処理されるため、次のようになります。QProcess

QString command = "cmd.exe";
QStringList arguments = 
    QStringList() << "/c" << "C:\\Program Files\\path_to_dir\\executable";
// note there are two arguments now, and the path is not enclosed in quotes
proc.start(command, arguments);
于 2013-01-18T16:58:51.263 に答える