在powershell脚本中使用包含多个参数的单个可延展对象


0

我有一堆参数,我想多次传递给一个命令。为了减少写入相同参数的次数,从而减少我必须维护这些参数的位置数,我认为将它们全部放在字符串中并传递该字符串是个好主意。但是,该命令将整个字符串视为单个参数,这自然会导致问题。

这是我想要实现的脚本示例。(这是用于构建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...

只是为了在x86中构建GDAL的本机部分,我需要运行nmake三次。我可能不需要为每次运行都需要所有相同的参数nmake,但是不清楚哪些参数需要哪些运行并且跟踪它只是需要维护的额外事情。好吧,重复这个调试,然后发布和调试x64,然后几次创建C#包装器。

如果我无法修改这样的参数集合,我还必须复制代码,以确定是否要构建依赖于libcurl的GDAL。如果我还要添加对其他依赖库的支持,复杂性将变得非常大。

我试图将整个命令变成一个字符串,以便以$options下列方式扩展无济于事:

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

整个字符串当然被视为命令而不是带参数的命令......

我在写这个问题的时候确实找到了答案,但我还是决定要求帮助那些可能像我一样疯狂地寻找解决方案的人。我仍然会欢迎以不同方式解决同样问题的答案!也许那些不依赖于在一个字符串中收集的参数?

Answers:


0

我在Invoke-Expession命令中找到了解决方案。

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

使用此字符串首先展开$options,然后Invoke-Expression将整个字符串作为带参数的命令读取。

我仍然欢迎以不同方式解决同一问题的其他答案!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.