4

一时兴起,为了学习 PowerShell,我知道自己落后了,我决定编写一个超级简单的脚本来使用 MSBuild 清理代码中的一堆解决方案,然后用一组特定的参数构建它们。这是脚本:

$sourceDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$cleanArgs = '/t:clean /verbosity:q /nologo /P:Configuration=Debug'
$buildArgs = '/verbosity:q /nologo /P:Platform="Any CPU";Configuration=Debug'
$solutions = @("asdf.sln","qwer.sln","zxcv.sln","yuio.sln","hjkl.sln","nm.sln")

function buildWithArgs([string[]]$solutionsToBuild = @(), [string]$args = 'default')
{
    Write-Host args: $args
    foreach($sln in $solutionsToBuild)
    {
        & $env:WINDIR\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe "$sourceDir\$sln $args" | Out-Default
    }
}

buildWithArgs $solutions $buildArgs
buildWithArgs $solutions $cleanArgs

现在,我的问题是函数“buildWithArgs”不尊重 $args 参数,当我运行或调试脚本时,无论我传入什么参数,该参数始终为空。但是,$solutionsToBuild 参数完美无缺。我有不正确的语法吗?即使我的 $cleanArgs 字符串格式不正确或未转义,我什至无法使该函数与“asdf”之类的简单字符串一起使用,因为当我运行它时 $args 始终为空。感谢您可以为肯定是一些小而愚蠢的错误提供任何帮助!

4

2 回答 2

3

首先,$args是 PowerShell 中的一个特殊的内置参数,它表示函数的所有参数。这样做的副作用之一是您无法在 ISE 调试器中看到它的值。尝试将其名称更改为MSBuildArgs.

确保将buildArgs和定义cleanArgs为数组。您将它们定义为一个字符串。这样做是为了可以使用 PowerShell 的 splat 运算符(@而不是$在引用变量时),它将数组中的每个参数作为参数发送给命令。

最后,您不需要引用存储在变量中的参数。PowerShell 将为您做任何报价。

进行这些更改后,您将拥有如下内容:

$sourceDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$cleanArgs = @('/t:clean','/verbosity:q','/nologo','/P:Configuration=Debug')
$buildArgs = @('/verbosity:q','/nologo','/P:Platform="Any CPU";Configuration=Debug')
$solutions = @("asdf.sln","qwer.sln","zxcv.sln","yuio.sln","hjkl.sln","nm.sln")

function buildWithArgs([string[]]$solutionsToBuild = @(), [string[]]$MSBuildArgs= 'default')
{
    Write-Host args: $args
    foreach($sln in $solutionsToBuild)
    {
        $msbuildPath = Join-Path $env:WINDIR Microsoft.NET\Framework64\v4.0.30319\msbuild.exe -Resolve
        & $msbuildPath (Join-Path $sourceDir $sln -Resolve) @MSBuildArgs | `
            Out-Default
    }
}

buildWithArgs $solutions $buildArgs
buildWithArgs $solutions $cleanArgs
于 2012-09-11T18:34:07.703 回答
2

$args是 powershell 函数中的一个特殊的自动变量。它包含一个参数数组,这些参数未绑定到函数的声明参数。由于运气不佳/缺乏经验,您碰巧将声明的参数之一命名为相同的名称,这将导致问题。

如果您将参数重命名为其他名称,例如$BuildArgs,它应该被正确绑定。

但是请注意,您当前的代码将使用由解决方案路径和 args 组成的单个参数执行 msbuild。这不是使用多个参数调用 msbuild 的语法。如果这会给您带来问题,我建议您打开另一个问题或在线搜索该特定问题,这样这个问题就不会变得太大。

于 2012-09-11T18:25:21.897 回答