一时兴起,为了学习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在运行时总是为空。感谢您提供任何帮助,肯定是一些小而愚蠢的错误!
答案 0 :(得分: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
答案 1 :(得分:2)
$args
是powershell函数中的special automatic variable。它包含一个参数数组,这些参数不会与函数的声明参数绑定。通过简单的运气不好/缺乏经验,你碰巧将你声明的一个参数命名为相同,这将导致问题。
如果您将参数重命名为其他内容,例如$BuildArgs
,则应将其正确绑定。
但请注意,您当前的代码将使用由解决方案路径和args组成的单个参数执行msbuild。使用多个参数调用msbuild不是语法。如果这会给您带来问题,我建议您打开另一个问题或在线搜索该特定问题,这样这个问题就不会太大。