2012-03-29 9 views
0

Ich möchte zwei Parameter lesen, die an eine Batch-Datei übergeben werden. Die Stapeldatei wird von einem C++ - Programm mit der CreateProcess-Methode ausgeführt. Der zweite Parameter der Batch-Datei ist ein Ordnerpfad. Wenn ich also den zweiten Parameter wie "E: \ test folder \ test2" übergebe, wird die Batch-Datei nicht ausgeführt.Analysieren Sie mehrere Argumente in einer Batchdatei.

Wenn ich aber stattdessen E: \ test folder \ test2 überlasse, wird die Batchdatei ausgeführt, aber offensichtlich hat der zweite Parameter nur den Wert E: \ test. Also möchte ich den ersten Parameter mit lesen % 1 und den Rest des Inhalts in eine andere Variable bringen.

Kann mir jemand sagen, wie ich das erreichen kann? Ich habe es mit% * versucht, aber es gibt mir sowohl den ersten als auch den zweiten Parameter. Ich möchte das erste Token mit Leerzeichen als Trennzeichen entfernen, damit ich den Rest des Inhalts in der Variablen habe. Gibt es eine Möglichkeit, dies zu tun?

Zum Beispiel, wenn ich pass test.bat testparameter1 E: \ Testordner \ test folder2 \ test Ordner3

Ich mag würde den Wert E lesen: \ Testordner \ test folder2 \ test Ordner3 in eine Variable.

Wenn ich test.bat testparameter1 E passieren: \ test \ test FolderX \ test folderY die valueIi lesen möchten in einer Variablen innerhalb der Batchdatei ist E: \ test \ test FolderX \ test folderY

Can Jemand hilft mir dabei? Danke im Voraus.

+1

Können Sie Ihre vollständige CreateProcess-Anweisung anzeigen? Ich vermute, dass die Anführungszeichen um Ihr 2. Argument geflüchtet sein müssen. – dbenham

Antwort

0

Wenn Ihre Batch-Datei mit

test.bat testparam1 "E:\test\folder2\test folder 3" 

genannt wird, können Sie die Parameter lesen %1 und %2 mit

rem Contents of test.bat 
@echo %0 
@echo %1 
@echo %2 

Die oben erzeugt:

C:\Temp>test testparam1 "E:\test\folder2\test folder 3" 
test.bat 
testparam1 
"E:\test\folder2\test folder 3" 

C:\Temp> 

So haben Sie bereits die Parameter als Variablen; sie heißen %1 für die erste, %2 für die zweite und so weiter.

Wenn das Problem ist, dass Sie versuchen, etwas mit dem „E: \ test \ folder2 \ Testordner 3“ zu tun Weg, so stellen Sie sicher, dass Sie einen Backslash hinzufügen, bevor es im Vorbeigehen:

"E:\test\folder2\test folder 3\" 
+0

Danke Ken, das Problem ist gut funktioniert, wenn ich einen Parameter von der Befehlszeile direkt mit doppelten Anführungszeichen übergeben, wie Sie erwähnt, aber wenn ich versuche, die Batch-Datei aus C++ - Code mit CreateProcess-Methode auszuführen, dann aus irgendeinem Grund die Batch-Datei nicht ausgeführt werden, wenn ich Argumente mit Doulbe-Zitaten übergebe. Es ist sehr rätselhaft und ich weiß nicht, warum es passiert. –

+0

Bearbeiten Sie Ihre Frage oben, um den von Ihnen verwendeten CreateProcess-Code bereitzustellen. Da die Batchdatei in Ordnung ist, muss das Problem in der Art bestehen, wie Sie die Befehlszeile an CreateProcess übergeben. –

2

Können Sie Leerzeichen in dem Pfad durch ein anderes Zeichen in Ihrem C++ - Code ändern? Zum Beispiel, wenn wir Räume, die durch arroba ändern, dann könnte man dies passieren:

test.bat testparameter1 E:\[email protected]\[email protected]\[email protected] 

und in der Batch-Datei das Gegenteil tun Änderung auf diese Weise:

set param2=%2 
set param2=%param2:@= % 

Ein weiteres mögliches Verfahren ist alles zu sammeln, Parameter von der zweiten in derselben Variablen, die jeweils durch ein Leerzeichen getrennt sind:

set param1=%1 
shift 
set param2= 
:nextParam 
set param2=%param2% %1 
shift 
if not "%1" == "" goto nextParam