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

Вот пример сценария того, чего я добиваюсь. (Это для строительства 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"

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

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

1 ответ1

0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .