Powershell脚本中哪些行返回输出?

时间:2011-08-09 20:30:58

标签: powershell

通常,有没有一种方便的方法来确定PowerShell脚本/函数的哪些行返回值(“未捕获”)?我希望有一种方法可以在调试时查询要返回的值的当前状态。我可以在每一行后检查它,看看哪些行添加到它。

我有一些脚本在工作,有些行将我的返回值转换为Object []。我通常将这些线管道输出Out-Null来修复这种情况。我只想要返回一个对象(我在函数末尾选择的对象)。

有些行是Cmdlet调用,有些是对其他函数的调用,有些是.NET对象的函数调用。

2 个答案:

答案 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种方法的输出。