为什么Trap块中的变量赋值在其外部不可见?

时间:2010-01-04 18:14:21

标签: powershell

为什么我在Trap块中创建的变量赋值在其外部不可见?

$integer = 0;
$string = [String]::Empty;
$stringBuilder = new-object 'System.Text.StringBuilder';

trap
{
    $integer = 1;
    $string = '1';
    $stringBuilder.Append('1');

    write-host "Integer Variable Inside: " $integer;
    write-host "String Variable Inside: " $string;
    write-host "StringBuilder Variable Inside: " $stringBuilder;

    continue;
}
$dummy = 1/$zero;

write-host "Integer Variable Outside: " $integer;
write-host "String Variable Outside: " $string;
write-host "StringBuilder Variable Outside: " $stringBuilder;

我原本预计Trap块内外的结果是相同的,但这些是我看到的结果。

Integer Variable Inside:  1
String Variable Inside:  1
StringBuilder Variable Inside:  1
Integer Variable Outside:  0
String Variable Outside:
StringBuilder Variable Outside:  1

请注意,只有StringBuilder保留其值。

我猜这与值和引用类型之间的区别有关,但不能完全确定它。

2 个答案:

答案 0 :(得分:4)

上面有info that slipsec provided并经过一些进一步的实验,我现在明白这里发生了什么。

Joel explains陷阱范围的工作原理如下。

  

即使在我们的错误处理程序中我们   能够访问的价值   $结果,看到它是真的......和   即使我们将其设置为$ False,并且   打印出来,这样你就可以看到它   设置...该函数仍然返回True,   因为陷阱范围不会修改   外部范围,除非你   明确设置a的范围   变量。注意:如果您使用过   $ script:结果而不是$ result(in   每个出现$ result的实例   在那个剧本中),你会得到的   字符串/注释导致的输出   你期待。

因此,可以读取陷阱范围之外的变量但不设置它们,因为它们是原件的副本(感谢Jason)。这就是为什么Integer变量没有保留其值的原因。但是,StringBuilder是一个引用对象,变量只是指向该对象的指针。陷阱范围内的代码能够读取变量设置的引用并修改它所指向的对象 - 变量本身不需要更改。

请注意,Joel关于指定变量范围的提示允许我在陷阱范围内设置Integer变量的值。

$ script:integer = 0; $ string = [String] :: Empty; $ stringBuilder = new-object'System.Text.StringBuilder';

trap
{
    $script:integer = 1;
    $string = '1';
    $stringBuilder.Append('1');

    write-host "Integer Variable Inside: " $script:integer;
    write-host "String Variable Inside: " $string;
    write-host "StringBuilder Variable Inside: " $stringBuilder;
    continue;
}
$dummy = 1/$zero;

write-host "Integer Variable Outside: " $script:integer;
write-host "String Variable Outside: " $string;
write-host "StringBuilder Variable Outside: " $stringBuilder;

......这些都是结果。

Integer Variable Inside:  1
String Variable Inside:  1
StringBuilder Variable Inside:  1
Integer Variable Outside:  1
String Variable Outside:
StringBuilder Variable Outside:  1

请注意,字符串变量不会保留其值,因为虽然它是引用类型,但它也是不可变的。

答案 1 :(得分:2)

不是重写Jakul关于这个主题的优秀帖子,我只是链接它: http://huddledmasses.org/trap-exception-in-powershell/

有关powershell如何处理错误处理的大量详细信息。