【问题标题】:Best practices for writing PowerShell scripts for local and remote usage为本地和远程使用编写 PowerShell 脚本的最佳实践
【发布时间】:2011-02-09 17:50:45
【问题描述】:

编写将在远程上下文中执行的脚本的最佳实践是什么?

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

【问题讨论】:

    标签: powershell powershell-remoting


    【解决方案1】:

    简介

    您发现了一个主要区别,$profile 未配置。

    Buried in MSDN here are some FAQs about remote powershell,或者get-help about_Remote_FAQ

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

    例如,以下命令运行 C​​urrentUserCurrentHost 配置文件 从 $s 中的会话中的本地计算机。

        invoke-command -session $s -filepath $profile
    

    以下命令运行 C​​urrentUserCurrentHost 配置文件 $s 中会话中的远程计算机。因为 $profile 变量 未填充,该命令使用配置文件的显式路径。

        invoke-command -session $s {. "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"}
    

    序列化

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

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

    【讨论】:

    • 谢谢,在发布 this question 关于 get-childItem 以及显然是序列化之前,我应该更仔细地阅读您的答案。
    【解决方案2】:

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

    $var = 5
    $sb={ $var }
    &$sb # 5
    Start-Job $sb | Wait-Job | Receive-Job # nothing
    

    【讨论】:

    • Scott,您的示例不起作用的原因是 $var 在作为作业执行时不在范围内。请记住,PowerShell 作业实际上依赖于 PowerShell 远程处理,因此正在启动一个全新的 PowerShell 实例来处理您的作业。试试你的例子 $sb = { Test-Path variable:\var }
    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2010-10-11
    • 2015-12-10
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多