通常,有没有一种方便的方法来确定PowerShell脚本/函数的哪些行返回值(“未捕获”)?我希望有一种方法可以在调试时查询要返回的值的当前状态。我可以在每一行后检查它,看看哪些行添加到它。
我有一些脚本在工作,有些行将我的返回值转换为Object []。我通常将这些线管道输出Out-Null来修复这种情况。我只想要返回一个对象(我在函数末尾选择的对象)。
有些行是Cmdlet调用,有些是对其他函数的调用,有些是.NET对象的函数调用。
答案 0 :(得分:6)
我想您可以使用Set-PsDebug -trace 1
查看返回的行。
示例:
考虑以下脚本:
function f{
1..10
}
function g{
f
return 11
}
g
执行Set-PsDebug -trace 1
后,跟踪将如下所示:
DEBUG: 1+ <<<< .\test.ps1
DEBUG: 1+ function f <<<< {
DEBUG: 5+ function g <<<< {
DEBUG: 10+ <<<< g
DEBUG: 6+ <<<< f
DEBUG: 2+ 1.. <<<< 10
1
2
3
4
5
6
7
8
9
10
DEBUG: 7+ return <<<< 11
11
显然,您可以看到输出的来源。但是如果输出被捕获,你就不会得到它。
此外,如果您不关心正在返回的其他对象,并且只希望获得使用return
语句返回的最后一个对象,则可以始终执行(func)[-1]
之类的操作。或func | select -last 1
(如评论中所指出的)获得最后一个。
答案 1 :(得分:3)
要完成可能的答案,我想添加2个音符:
首先,如果使用func | select -last 1
,则必须将返回的对象包装到数组中,如果返回数组本身。为什么?看一下失败的样本:
function MyOutputs {
$list = new-Object Collections.ArrayList
$list.Add('first')
$list.Add('second')
$list
}
myoutputs | Select -last 1 #doesn't work
其次,如果你不确切知道哪些命令返回输出,你可以Out-Null
这些都是这样的:
function MyOutputs {
. {
$list = new-Object Collections.ArrayList
$list.Add('first') # returns index
$list.Add('second') # returns index
} | Out-Null
write-Host Returning...
$list
}
$a = MyOutputs
Write-Host Result is
$a
尝试将ArrayList代码放在scriptblock之外,您将看到它的作用。使用.
表示法在scriptblock内运行它意味着脚本块在当前范围内执行。 Out-Null
只是吃Add
种方法的输出。