为本地和远程使用编写PowerShell脚本的最佳实践

为本地和远程使用编写PowerShell脚本的最佳实践,powershell,powershell-remoting,Powershell,Powershell Remoting,对于编写将在远程上下文中执行的脚本,有哪些最佳实践 例如,我刚刚发现,在远程执行期间,内置的var$Profile不存在。脚本块不像通常那样充当闭包: $var = 5 $sb={ $var } &$sb # 5 Start-Job $sb | Wait-Job | Receive-Job # nothing 轮廓 您发现了一个主要区别,$profile未配置 ,或获取有关远程常见问题解答的帮助 在“我的个人资料在哪里?”(呵呵)下面,它解释道: 例如,以下命令运行CurrentUse

对于编写将在远程上下文中执行的脚本,有哪些最佳实践


例如,我刚刚发现,在远程执行期间,内置的var
$Profile
不存在。

脚本块不像通常那样充当闭包:

$var = 5
$sb={ $var }
&$sb # 5
Start-Job $sb | Wait-Job | Receive-Job # nothing
轮廓 您发现了一个主要区别,
$profile
未配置

,或获取有关远程常见问题解答的帮助

在“我的个人资料在哪里?”(呵呵)下面,它解释道:

例如,以下命令运行CurrentUserCurrentHost配置文件 从会话中的本地计算机以$s为单位

以下命令从运行CurrentUserCurrentHost配置文件 会话中的远程计算机以$s为单位。因为$profile变量 如果未填充,则该命令使用配置文件的显式路径

系列化 另一个可能会影响您的差异是,当您远程运行命令并返回它们时,命令返回的.NET对象不是直接返回的,而是通过连接进行序列化和反序列化。许多对象支持这种精细化,但有些对象不支持。Powershell会自动删除不再“连接”的对象上的方法,它们基本上是数据结构,然后。。。但它确实在某些类型上重新挂钩方法,如
DirectoryInfo


通常您不必担心这一点,但如果您通过管道返回复杂对象,您可能…

Scott,您的示例不起作用的原因是$var作为作业执行时不在范围内。请记住,PowerShell作业实际上依赖于PowerShell远程处理,因此正在启动一个全新的PowerShell实例来处理您的作业。用$sb={Test Path variable:\var}试试你的例子谢谢,我应该在发布关于get childItem和序列化的文章之前仔细阅读你的答案。
    invoke-command -session $s -filepath $profile
    invoke-command -session $s {. "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"}