为什么我在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保留其值。
我猜这与值和引用类型之间的区别有关,但不能完全确定它。
答案 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如何处理错误处理的大量详细信息。