为什么我的PowerShell函数的参数显示为空/空?

时间:2012-09-11 18:16:19

标签: powershell scripting powershell-v2.0

一时兴起,为了学习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在运行时总是为空。感谢您提供任何帮助,肯定是一些小而愚蠢的错误!

2 个答案:

答案 0 :(得分:3)

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

确保将buildArgscleanArgs定义为数组。您将它们定义为一个单独的字符串。这样做是为了在引用变量时使用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

答案 1 :(得分:2)

$args是powershell函数中的special automatic variable。它包含一个参数数组,这些参数不会与函数的声明参数绑定。通过简单的运气不好/缺乏经验,你碰巧将你声明的一个参数命名为相同,这将导致问题。

如果您将参数重命名为其他内容,例如$BuildArgs,则应将其正确绑定。

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