Usando um único objeto maleável contendo vários argumentos para um comando em um script powershell

0

Eu tenho um monte de argumentos que eu quero passar para um comando várias vezes. Para diminuir a quantidade de vezes que escrevo os mesmos argumentos e, assim, diminuir o número de lugares onde tenho que manter esses argumentos, imaginei que seria uma boa idéia colocá-los todos em uma string e passar essa string. No entanto, o comando vê a string inteira como um único argumento, o que naturalmente causa problemas.

Aqui está uma amostra de script do que estou tentando alcançar. (Isto é para construir o GDAL, a propósito).

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

Apenas para construir a parte nativa do GDAL para lançamento em x86 eu preciso rodar nmake três vezes. Eu posso não precisar dos mesmos argumentos para cada série de nmake, mas não está claro quais argumentos são necessários para que executar e manter o controle de que seria apenas uma coisa extra para manter. Bem, repita isso para depurar e, em seguida, liberar e depurar para x64 e, em seguida, algumas vezes para criar wrappers C #.

Se eu não posso modificar uma coleção de argumentos como este eu também teria que duplicar o código para saber se eu quero ou não construir o GDAL com uma dependência no libcurl. A complexidade se tornaria massiva se eu tivesse que adicionar suporte para outras bibliotecas dependentes também.

Eu tentei fazer o comando inteiro em uma string para expandir $options das seguintes maneiras sem sucesso:

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

A string inteira é vista como um comando e não como um comando com argumentos ...

Na verdade, encontrei a resposta enquanto escrevia essa pergunta, mas decidi perguntar de qualquer maneira para ajudar outras pessoas que talvez estivessem procurando uma solução tão freneticamente quanto eu. Ainda vou receber respostas que resolvam o mesmo problema de uma maneira diferente! Talvez aqueles que não confiam nos argumentos coletados em uma única string?

Kapten-N
fonte

Respostas:

0

Eu encontrei a solução no Invoke-Expession comando.

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

Com isso, a string primeiro se expande $options e depois Invoke-Expression lê toda a string como um comando com argumentos.

Ainda saúdo outras respostas que resolvem o mesmo problema de maneiras diferentes!

Kapten-N
fonte