我试图使用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被求值为第一个"未捕获"表达式。嗯?
另外,如果我确实想要这个块总是求值为return语句,甚至是最后一个语句,有人知道我该怎么做吗?
整个脚本块被执行并返回结果。$ret2将包含三个答案。第一个是"1",第二个是"2",第三个是Get-Culture的输出。您可以通过查看$ret2[0]、$ret2[1]和$ret[2]来研究它们。您可以使用$ret2.count查看返回了多少结果。
下面显示了我计算机上$ret2中的所有内容。
PS C:UsersuserDocumentsPowerShell> $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