编写将在远程上下文中执行的脚本的最佳实践是什么?
例如,我刚刚发现内置 var $Profile
在远程执行期间不存在。
您发现了一个主要区别,即$profile
未配置。
埋在 MSDN 这里是一些关于远程 powershell 的常见问题解答,或者做get-help about_Remote_FAQ
。
在“我的个人资料在哪里?” (呵呵)它解释说:
例如,以下命令在 $s 中的会话中从本地计算机运行 CurrentUserCurrentHost 配置文件。
invoke-command -session $s -filepath $profile
以下命令在 $s 中的会话中从远程计算机运行 CurrentUserCurrentHost 配置文件。由于未填充 $profile 变量,因此该命令使用配置文件的显式路径。
invoke-command -session $s {. "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"}
另一个可能影响您的区别是,命令返回的 .NET 对象不是直接返回,而是当您远程运行它们并返回它们时,它们会通过网络进行序列化和反序列化。许多对象都支持这个罚款,但有些不支持。Powershell 会自动删除不再“挂钩”的对象上的方法,它们基本上是数据结构......但它确实会重新挂钩某些类型的方法,例如DirectoryInfo
.
通常你不必担心这一点,但如果你通过管道返回复杂的对象,你可能......
脚本块不像通常那样充当闭包:
$var = 5
$sb={ $var }
&$sb # 5
Start-Job $sb | Wait-Job | Receive-Job # nothing