Verwenden eines einzelnen verformbaren Objekts, das mehrere Argumente für einen Befehl in einem Powershell-Skript enthält

305
Kapten-N

Ich habe eine Reihe von Argumenten, die ich mehrmals an einen Befehl übergeben möchte. Um die Anzahl der Male zu verringern, in denen ich dieselben Argumente schreibe, und damit die Anzahl der Stellen, an denen ich diese Argumente beibehalten muss, zu verringern, dachte ich, es wäre eine gute Idee, sie alle in eine Zeichenfolge zu setzen und diese Zeichenfolge zu übergeben. Der Befehl sieht jedoch die gesamte Zeichenfolge als ein einziges Argument, was natürlich Probleme verursacht.

Hier ist ein Skriptbeispiel dessen, was ich erreichen möchte. (Dies ist für den Bau von GDAL, übrigens).

$baseOptions = "MSVC_VER=1910 GDAL_HOME='$outputDir\' SWIG='$swig'"  #Building x86 if($x86 -eq $true) { $options = $baseOptions + " BINDIR='$outputDir\x86\bin' LIBDIR='$outputDir\x86\lib' INCDIR='$outputDir\x86\include'" if($useLibcurl -eq $true) { $options += " CURL_DIR='$libcurlDir/x86' CURL_INC='-I$libcurlDir/include' CURL_LIB='$libcurlDir/x86/lib/libcurl.lib wsock32.lib wldap32.lib winmm.lib'" }  #Building x86 release if($release -eq $true) { nmake /f makefile.vc $options nmake /f makefile.vc install $options nmake /f makefile.vc devinstall $options } #Repeated for debug... #Some more use of $options to create C# wrappers... } #Repeated for x64... 

Um den nativen Teil von GDAL für die Veröffentlichung in x86 zu erstellen, muss ich nmakedreimal laufen . Ich brauche vielleicht nicht die gleichen Argumente für jeden Durchlauf nmake, aber es ist unklar, welche Argumente für welchen Durchlauf benötigt werden, und wenn man den Überblick behält, wäre dies eine zusätzliche Sache, die beibehalten werden muss. Nun, wiederholen Sie dies für Debugging und dann sowohl für x64 als auch für x64 und dann einige Male, um C # - Wrapper zu erstellen.

Wenn ich eine Sammlung von Argumenten wie diese nicht ändern kann, muss ich auch den Code duplizieren, ob ich GDAL mit einer Abhängigkeit von libcurl erstellen möchte oder nicht. Die Komplexität würde enorm werden, wenn ich Unterstützung für andere abhängige Bibliotheken hinzufügen muss.

Ich habe versucht, den gesamten Befehl in eine Zeichenfolge umzuwandeln, um $optionsauf folgende Weise ohne Erfolg zu erweitern:

. "nmake /f makefile.vc $options" & "nmake /f makefile.vc $options" 

Die gesamte Zeichenfolge wird natürlich als Befehl und nicht als Befehl mit Argumenten angesehen.

Ich habe die Antwort tatsächlich beim Schreiben dieser Frage gefunden, aber ich entschied mich trotzdem zu bitten, anderen zu helfen, die möglicherweise genauso verzweifelt nach einer Lösung suchen wie ich. Ich freue mich immer noch über Antworten, die dasselbe Problem auf andere Weise lösen! Vielleicht diejenigen, die sich nicht auf die Argumente verlassen, die in einer einzelnen Zeichenfolge gesammelt werden?

0

1 Antwort auf die Frage

0
Kapten-N

Ich habe die Lösung im Invoke-ExpessionBefehl gefunden.

Invoke-Expression "nmake /f makefile.vc $options" 

Damit erweitert sich der String zunächst $optionsund Invoke-Expressionliest den gesamten String als Befehl mit Argumenten.

Ich begrüße noch andere Antworten, die dasselbe Problem auf unterschiedliche Weise lösen!