Использование одного изменяемого объекта, содержащего несколько аргументов для команды в сценарии powershell

217
Kapten-N

У меня есть куча аргументов, которые я хочу передать команде несколько раз. Чтобы уменьшить количество раз, когда я пишу одни и те же аргументы, и, таким образом, уменьшать количество мест, где я должен поддерживать эти аргументы, я подумал, что было бы неплохо поместить их все в строку и передать эту строку. Однако команда видит всю строку как один аргумент, что, естественно, вызывает проблемы.

Вот пример сценария того, чего я добиваюсь. (Это для строительства GDAL, кстати).

$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... 

Просто для сборки нативной части GDAL для выпуска в x86 мне нужно запустить nmakeтри раза. Возможно, мне не понадобятся одинаковые аргументы для каждого прогона nmake, но неясно, какие аргументы нужны для того, для чего прогон и отслеживание этого просто лишняя вещь, которую нужно поддерживать. Что ж, повторите это для отладки, а затем выпустите и отладьте для x64, а затем несколько раз для создания оболочек C #.

Если я не могу изменить набор аргументов, подобных этому, мне также придется продублировать код, чтобы узнать, хочу ли я создать GDAL с зависимостью от libcurl. Сложность станет огромной, если мне придется добавить поддержку других зависимых библиотек.

Я попытался превратить всю команду в строку, чтобы развернуть $optionsее следующими способами, но безрезультатно:

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

Вся строка, конечно, рассматривается как команда, а не команда с аргументами ...

На самом деле я нашел ответ, когда писал этот вопрос, но решил все равно попросить помочь тем, кто может искать решение так же отчаянно, как и я. Я все равно буду приветствовать ответы, которые решают ту же проблему по-другому! Может быть, те, которые не полагаются на аргументы, собранные в одну строку?

0

1 ответ на вопрос

0
Kapten-N

Я нашел решение в Invoke-Expessionкоманде.

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

При этом строка сначала расширяется, $optionsа затем Invoke-Expressionчитает всю строку как команду с аргументами.

Я все еще приветствую другие ответы, которые решают ту же проблему по-разному!