Frage

Ich habe laufen mit einem Qt-Programm in einen seltsamen Fehler unter Windows laufen. Das Programm verwendet QProcess ein Kind Prozess wit zwei Argumente, um zu laichen. Das Programm und Argumente an die QProcess weitergegeben :: start () Methode sind von der Form:

"batchfile.bat" "--option1=some_value" "--option2=some_other_value\with_a\path"

Aus irgendeinem Grund durch die Zeit, die Optionen auf die Batch-Datei erhalten für die Verarbeitung der Gleichheitszeichen in Leerzeichen umgewandelt wurden, und es sieht nun wie:

"batchfile.bat" "--option1 some_value" "--option2 some_other_value\with_a\path"

aus diesem Grunde schlägt die Verarbeitung. Irgendwelche Ideen, was könnte die Gleichheitszeichen verursacht durch Leerzeichen ersetzt werden? Ich verwende die mingw Build des QT 4.6.3 Framework auf der Qt-Download-Seite.

EDIT: Hier ist der eigentliche Code. Ich habe es nicht geschrieben (Ich bin eine komplette Qt Noob), aber ich habe zu versuchen, es zum Laufen zu bringen. Es ist Teil eines automatisierten Build-System, das läuft auf zwei Versionen von RHEL (4 und 5), OS X und Windows. Und es funktioniert gut überall aber Windows.

QProcess sconsProcess;
sconsProcess.setWorkingDirectory(build.getBuildLocation());
sconsProcess.setProcessChannelMode(QProcess::MergedChannels);

qDebug()<<"Starting scons process:"<<build.getSconsLocation()<<QString("--variant=%1-%2").arg(build.getOs()).arg(build.getVariant())<<
          QString("--source-release=%1").arg(build.getSettings().getSetting("sourceReleaseLocation", QStringList()<<"BUILDLOCATION"<<"VERSION",
                    QStringList()<<build.getBuildLocation()<<build.getBuildPackage().getVersion()).toString());
sconsProcess.start(build.getSconsLocation(), QStringList()<<QString("--variant=%1-%2").arg(build.getOs()).arg(build.getVariant())<<
          QString("--source-release=%1").arg(build.getSettings().getSetting("sourceReleaseLocation", QStringList()"BUILDLOCATION"<<"VERSION",
                    QStringList()<<build.getBuildLocation()<<build.getBuildPackage().getVersion()).toString()));
qDebug()<<"Source release build process started";

Die actaul Werte, die in in Windows übersetzt (das Bit, das in dem ersten qDebug () print Anruf ausgedruckt wird) ist:

debug: Ab scons Prozess: "V: \ Glast_Software \ Toaster \ Tools \ python2.5 \ Scripts \ scons-1.3.0.bat" "--variant = Windows i386-32bit-vc71-Debug" „- -source-release = V: \ Glast_Software \ Toaster \ ReleaseManagerBuild \ Windows-i386-32bit-vc71 \ Debug \ ScienceTools \ latest-1-3163 \ ScienceTools-LATEST-1-3163-source.zip“

Jedoch innerhalb des scons-1.3.0.bat (ich hatte es echo alle die ausgeführten Befehle) die übergebenen Parameter wie folgt aussehen:

"- Variante von Windows-i386-32bit-vc71-Debug" „--source-Release V: \ Glast_Software \ Toaster \ ReleaseManagerBuild \ Windows-i386-32bit-vc71 \ Debug \ ScienceTools \ latest-1-3163 \ ScienceTools-LATEST-1-3163-source.zip "

mit den Gleichheitszeichen fehlt.

EDIT (6/29/10) : Ich sollte hinzufügen, dass dieses System ausgelegt ist, auf einem kleinen Windows-Batch-Farm-System mit dem LSF Batch-Queuing auszuführen. Es scheitert nur, wenn der Prozess als Batch-Job ausgeführt wird. Wenn ich dieses Programm von der Kommandozeile ausgeführt wird auf einem der Batch-Maschinen, es funktioniert perfekt und genau das tut, was es tun soll. Vielleicht ist es ein Umweltproblem.

War es hilfreich?

Lösung

Es gibt eine gute Chance, dass dies, weil die Anführungszeichen nicht durch (was sie auch sein mögen entkommen müssen, finden Sie in der Dokumentation für QProcess :: start () ).

cmd.exe behandeln Gleichheitszeichen in Kommandozeilen-Optionen, die als Trennzeichen zwischen Argumenten notiert sind ähnlich ein Leerzeichen oder Tab. Nur eine von sehr vielen Bits von Merkwürdigkeit in Windows cmd Scripting:

C:\test>type c:\util\cmdechoargs.cmd
@echo off
setlocal
set /a i=0
echo args[*]: %*
:loop
if {%1} == {} goto :eof
echo argv[%i%]: %1
set /a i=%i% + 1
shift
goto :loop


C:\test>cmdechoargs testing=123
args[*]: testing=123
argv[0]: testing
argv[1]: 123

C:\test>cmdechoargs "testing=123"
args[*]: "testing=123"
argv[0]: "testing=123"

Die beste Dokumentation ich begegnet bin, wie Kommandozeilenargumente in Windows verarbeiten Skripte cmd Tim Hill "Windows NT Shell Scripting" - eine für nur einen Cent verwendet bekommen

Auf der Grundlage der Beispiele in Ihrem Update gegeben, ich glaube, Sie Ihre Optionen wünschen könnte, das Gleichheitszeichen in ihnen müssen Anführungszeichen haben in ihnen eingebettet:

"\"--variant=%1-%2\""
"\"--source-release=%1\""

Bearbeiten - neues Material

Das folgende Skript hat eine Routine, die die Anführungszeichen weg von Argument an eine cmd-Skript übergeben Streifen wird. Die Routine kehrt das ‚dequoted‘ Argument in einer Umgebungsvariablen namens RET ein Idiom / Technik von Tim Hill Buch mit mir oben erwähnt. Ich habe einige der dequoting Code aus einem Beispiel hier: http://ss64.com/nt/ Syntax-esc.html , aber machte es ein bisschen robuste leere Anführungszeichen zu behandeln.

@echo off
setlocal
set /a i=0
echo args[*]: %*
:loop
if {%1} == {} goto :eof
echo.
echo argv[%i%]: %1

call :dequote %1
set dequoted_arg=%RET%
echo argv[%i%] ^(dequoted^): %dequoted_arg%

set /a i=%i% + 1
shift
goto :loop


:dequote
setlocal
SET _string=###%1###
if {%_string%} == {######} goto :dequote_empty
if {%_string%} == {###""###} goto :dequote_empty
SET _string=%_string:"###=%
SET _string=%_string:###"=%
SET _string=%_string:###=%
goto :dequote_done

:dequote_empty
set _string=

:dequote_done
endlocal & (set RET=%_string%) & goto :eof

Diese Art der Sache ist, warum Sie (meiner Meinung nach) vermeiden wollen cmd-Skripten mit Ausnahme der einfachsten Aufgaben. Aber ich hoffe, das hilft Ihnen nicht notierte Argumente zu Ihrem scons Prozess durch Ihre Batch-Datei übergeben.

Andere Tipps

Haben Sie versucht, die = Zeichen zu entkommen? die Pfade in Ihrem Beispiel auch, sicherlich müssen der \ Charakter zu entkommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top