powershell scriptblock的价值是什么?

时间:2013-06-08 21:22:02

标签: powershell-remoting scriptblock

我正在尝试使用powershell远程处理运行一段远程代码并获得一些我无法解释的奇怪行为。这是我运行的命令序列。

$sb1 = {$r1 = 1; $r2 = 2; $r3 = Get-Culture; return $r3}
$sb2 = {1; 2; $r3 = Get-Culture; return $r3}

$session = New-PSSession -ComputerName $comp -Credential $creds

$ret1 = Invoke-Command -Session $Session -ScriptBlock $sb1
$ret2 = Invoke-Command -Session $Session -ScriptBlock $sb2

$ret1
>>> en-US
$ret2
>>> 1

有没有人知道这种行为的原因?我觉得很奇怪。忽略return语句,并将scriptblock计算为第一个'uncaptured'表达式。嗯?

另外,如果我确实希望这个块总是评估为return语句,甚至是最后一个语句,那么有没有人知道我可以如何实现它?

1 个答案:

答案 0 :(得分:0)

执行整个脚本块并返回结果。 $ ret2将包含三个答案。第一个是“1”,第二个是“2”,第三个是Get-Culture的输出。你可以通过查看$ ret2 [0],$ ret2 [1]和$ ret [2]来探索这些。您可以使用$ ret2.count找出返回的结果数。

下面显示了我计算机上$ ret2中的所有内容。

PS C:\Users\user\Documents\PowerShell> $ret2 | select * | fl
@{PSComputerName=MyComputer; RunspaceId=b9568f5d-88a0-4346-be1a-827b8ba2f29d; PSShowComputerName=True}
@{PSComputerName=MyComputer; RunspaceId=b9568f5d-88a0-4346-be1a-827b8ba2f29d; PSShowComputerName=True}


PSComputerName                 : MyComputer
RunspaceId                     : b9568f5d-88a0-4346-be1a-827b8ba2f29d
Parent                         : en
LCID                           : 1033
KeyboardLayoutId               : 1033
Name                           : en-US
IetfLanguageTag                : en-US
DisplayName                    : English (United States)
NativeName                     : English (United States)
EnglishName                    : English (United States)
TwoLetterISOLanguageName       : en
ThreeLetterISOLanguageName     : eng
ThreeLetterWindowsLanguageName : ENU
CompareInfo                    : CompareInfo - en-US
TextInfo                       : TextInfo - en-US
IsNeutralCulture               : False
CultureTypes                   : SpecificCultures, InstalledWin32Cultures, FrameworkCultures
NumberFormat                   : System.Globalization.NumberFormatInfo
DateTimeFormat                 : System.Globalization.DateTimeFormatInfo
Calendar                       : System.Globalization.GregorianCalendar
OptionalCalendars              : {System.Globalization.GregorianCalendar, System.Globalization.GregorianCalendar}
UseUserOverride                : True
IsReadOnly                     : False