gpt4 book ai didi

.net - PowerShell cmdlet 与 .NET 类

转载 作者:行者123 更新时间:2023-12-02 22:14:45 27 4
gpt4 key购买 nike

编写 PowerShell 脚本时,有两个选项可用:

  • 调用cmdlet
  • 使用 .NET Framework Class library

  • 在后台,cmdlet 很可能使用 .NET 库。

    在性能方面,哪一个更适合在 Powershell 脚本中使用?

    我更喜欢直接使用 .NET 库,因为它更接近 C#。

    最佳答案

    When writing a Powershell script, two options are available:

    1. Call a cmdlet
    2. Use the .NET Framework Class library


    TBH,我认为这是对 PowerShell 的过度简化。

    首先值得指出的是 PowerShell(API 和 powershell.exe 主机应用程序)首先是在 .NET 中实现的,因此根据定义,PowerShell 中的所有内容都是“使用 .NET”。

    例如,一个 cmdlet 实际上是一个 .NET 对象 - 查看 Get-Command 返回的 CmdletInfo 对象:
    PS C:\> (Get-Command Get-Command) |Format-List Name,CommandType,DLL,ImplementingType


    Name : Get-Command
    CommandType : Cmdlet
    DLL : C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad36
    4e35\System.Management.Automation.dll
    ImplementingType : Microsoft.PowerShell.Commands.GetCommandCommand

    看看实现类型 Microsoft.PowerShell.Commands.GetCommandCommand - 它只是一个普通的 .NET 类 - 当你发出命令 Get-Command , powershell 创建这个类的一个实例,调用一些定义良好的方法,然后依次调用执行实际工作的 .NET 方法。

    PowerShell(或 Monad, as it was originally called)背后的整个理念是,开发时间最好花在能够做好一件事的小型自包含单元/功能上(原始概念中的单子(monad)),就像 UNIX 实用程序背后的原始理念一样.

    这个想法是,一旦你有了将这些单元耦合在一起的框架,你就可以通过连接更简单的单元来虚拟地组成任何程序。

    这个想法的具体化是 cmdlet - 它有一些明确定义的输入绑定(bind)行为,允许您组合管道:
    Get-AThing | Filter-TheThing | Write-ToAFile C:\path\to\file\name.ext

    在我看来,像上面这样的管道比例如:
    [System.IO.File]::WriteAllText('C:\path\to\file\name.ext', [System.Linq.Enumerable]::Select([Thing]::EnumerateThings(),{param([thing]$in) $in -eq $someCriteria}))

    这是主观的,但我想要说明的是,如果你在旁白中放弃了 cmdlet,那么你就是在欺骗自己利用 PowerShell 开箱即用免费提供的一些核心功能

    现在,对于实际的问题:是的,与调用 cmdlet 相比,直接调用单个 .NET 方法更快并且产生的开销更少,这反过来又使 PowerShell 运行一些额外的代码以最终包装相同的 .NET 方法调用。

    话虽如此,如果您运行的是较新版本的 PowerShell(4.0、5.0、5.1 或 6.0),在许多情况下开销可以忽略不计。

    例如,从磁盘读取文件比解析已经在内存中的 .NET 方法调用链慢几个数量级(这是 PowerShell 对您透明地做的事情),仅仅是因为将电子从旋转磁盘移动到磁盘 Controller 和内存总线进入内存是一种以光速为界的操作。

    我个人优化性能的策略是回顾我使用的算法/例程和数据结构,早在我开始考虑 cmdlet 与直接方法调用之前。

    如果我正在做一些愚蠢的事情,使我的脚本需要 10 倍的 CPU 周期来计算,那么试图追逐边际开销将无济于事。

    如果您已达到该策略的极限,请考虑使用 C# 或 VB.NET 编写 cmdlet - 编译代码(几乎)总是比解释代码快:-)

    关于.net - PowerShell cmdlet 与 .NET 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43521446/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com