PowerShell cmdlet 与 .NET 类

2023-11-22

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

  1. Call a cmdlet
  2. Use the .NET Framework 类库

在后台,cmdlet 很可能会利用 .NET 库。

从性能角度来看,在 Powershell 脚本中使用两者哪一个更好?

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


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

  1. 调用 cmdlet
  2. 使用 .NET Framework 类库

说实话,我认为这对 PowerShell 的内容过于简单化了is.

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

例如,cmdlet 实际上是一个 .NET 对象 - 看看由返回的 CmdletInfo 对象Get-Command:

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,正如它最初的名字一样),开发时间最好花在专注于做好一件事的小型独立单元/功能上(amonad在最初的概念中),很像 UNIX 实用程序背后的原始哲学。

这个想法是,一旦你有了一个将这些单元耦合在一起的框架,你几乎可以compose通过连接更简单的单元来进行任何程序。

这个想法的具体实现就是cmdlet- 它有一些明确定义的输入绑定行为,允许您编写管道:

Get-AThing | Filter-TheThing | Write-ToAFile C:\path\to\file\name.ext

以我的愚见,像上面这样的管道是way比以下示例更具可读性:

[System.IO.File]::WriteAllText('C:\path\to\file\name.ext', [System.Linq.Enumerable]::Select([Thing]::EnumerateThings(),{param([thing]$in) $in -eq $someCriteria}))

这是主观的,但我想要表达的是,如果您顺便放弃了 cmdlet,那么您就在欺骗自己,无法利用 PowerShell 免费提供的一些开箱即用的核心功能


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

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

例如,从磁盘读取文件比解析内存中已有的 .NET 方法调用链慢几个数量级(这就是 PowerShell 对您透明执行的操作),这仅仅是因为将电子从旋转的磁盘移动到磁盘控制器和内存总线进入内存是一个受光速限制的操作。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell cmdlet 与 .NET 类 的相关文章

  • 使用 ITextsharp 将 Html 导出为 PDF

    我已经尝试了下面的代码 我也遇到了错误 我正在使用最新的 DLL String strSelectUserListBuilder h1 My First Heading h1 p My first paragraph p String ht
  • WinApi:获取 COM 表单的控件名称

    我想用 Net 框架替换我当前的 UI 自动化工具 QTP 我需要测试 VB6 COM 应用程序 框架的基础之一是使用表单名称 到目前为止 我未能找到使用 Win API 获取这些数据的方法 该解决方案只有一个约束 即该解决方案必须依赖 N
  • 从 C# 检测 powerpoint 形状上的事件

    是否有可能检测在 Powerpoint 形状 例如箭头 上发生的事件 到目前为止 我发现唯一的可能性是 selectitemchanged beforerightclick 和 beforedoubleclick 但无法找到检测其他内容的方
  • 带有 UiPath 的 Powershell

    我正在使用 UiPath 启动 PowerShell 脚本 我需要从 UiPath 传递一个参数 首先这可能吗 其次有人有这方面的例子吗 不确定 PowerShell 脚本中的语法是什么 是否可以将参数从 UiPath 传递到终端 您的 P
  • 即使在 GC Collect 和 WaitForPendingFinalizers 之后,窗口对象在关闭后也未释放?

    这是一个简单的测试应用程序 可帮助了解 WPF 内存使用情况 我想了解的关键是为什么MainWindow即使在关闭并等待 GC 完成之后 仍然被引用并且它的内存没有被释放 参见下面的代码清单 文本 MainWindow Finalizer
  • 在调试模式下单步执行时跳过方法的属性

    是否有一个属性可以在方法上使用 以便在调试模式下单步执行某些代码时 调试器保持在方法的外部 DebuggerStepThrough docs https learn microsoft com en us dotnet api system
  • Spring.NET 和构造函数拦截器

    我正在尝试在构造时对对象进行一些 AOP 并找到了 IConstructorInterceptor 这对于我想要的东西来说是完美的 但它似乎不起作用 http jira springframework org browse SPRNET 2
  • System.Drawing.Image.Save 抛出ExternalException:GDI 中发生一般错误

    我有一个函数 它需要一个位图 复制它的一部分并将其保存为 8bpp tiff 结果图像的文件名是唯一的并且文件不存在 程序有权写入目标文件夹 void CropImage Bitmap map Bitmap croped new Bitma
  • 为什么我的 COM 对象不显示组件服务中的方法?

    我正在尝试创建一个 COM 对象并将其注册到 COM 下 一切似乎都很顺利 但是当我查看组件服务并深入了解时 控制台根目录 组件服务 电脑 我的电脑 COM 应用程序 测试通讯 组件 TestCom Com MyCom 接口 MyCom 方
  • Dotnet“新”命令不适用于 Framework 4.5?

    我正在尝试使用 dotnet 创建 4 5 框架类库项目new命令如下 dotnet new classlib lang C f net45 o TestProject 错误 无效参数 f 网络45 net45 不是 f 框架 的有效值 如
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code
  • 启动 psexec 后获取进程 ID

    我有一个使用 psexec 在远程计算机上调用记事本的脚本 有什么办法可以在启动后获取进程ID吗 这是我所拥有的 PCname MyPC SessionID 2 Program Notepad exe FilePath C temp Fil
  • Powershell 脚本无法从 SCCM 正常运行 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 如何在 VS2017/2015 中打开 .xproj 文件

    我有一个带有扩展名的 NET core 项目 xproj 当我在VS 2017中打开项目时 项目文件 xproj migrated to csproj 如何打开 xproj 文件 Visual Studio 2017 2015 我需要安装任
  • C# - 方法必须有返回类型

    我在调用 C 中的方法时遇到问题 不断收到消息 方法 计算 必须有返回类型 using System Diagnostics namespace WindowsFormsApplication1 public partial class F
  • 使用实体框架重叠约会

    我将 asp net mvc 与实体框架一起使用 我有一个包含 startat 字段 endat 字段和 roomid 字段 称为 SpaceConfigurationId 的约会列表 并且希望查找给定房间已重复预订的约会列表 可以假设 e
  • 如何等待远程 .NET 调试器连接

    今天我遇到了一个问题 我需要远程调试程序 该程序是从另一个系统启动的 所以我真的没有机会在命令行上与它交互 不过我可以很容易地改变它的来源 我需要做的是让程序正常启动 然后等待我用调试器附加到它 我想不出一个让我快乐的方法 我确实发现了这个
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub

随机推荐

  • 解析 SVG 并将其添加到 svg 元素

    我有一个服务 我想将 SVG 部件动态添加到 g 元素 这是服务返回的内容
  • 如何在正则表达式中忽略大小写?

    我有一个 ASP NET MVC 应用程序 有一个名为 File 的实体 它有一个名为 Name 的属性 using System ComponentModel DataAnnotations public class File Regul
  • 由于目标机器主动拒绝而无法建立连接(PHP / WAMP)

    Note 我意识到这可能被视为重复 但我查看了其他回复 但他们没有为我解决问题 我最近在 Windows 7 上安装了带有 mysql 插件的 Zend Studio 和 Zend Server 我不是一个合格的服务器管理员 但也不是完全无
  • ServiceStack Razor 身份验证

    我正在查看 Rockstars 示例和 ServiceStack Razor 我如何将身份验证融入到 secure cshtml 页面中 因此 如果需要 我可以将用户重定向到 Login cshtml 我只从 Social Bootstra
  • NGINX:从上游读取响应标头时上游超时(110:连接超时)

    我让 Puma 作为上游应用程序服务器运行 让 Riak 作为我的后台数据库集群 当我发送一个请求来映射约 25K 用户的数据块并将其从 Riak 返回到应用程序时 我在 Nginx 日志中收到错误 读取时上游超时 110 连接超时 来自上
  • 有没有办法在 Android 上预加载 AdMob 广告?

    我的应用程序中的 对话框 我创建的一个看起来像这样的视图 因为广告不适合正常的对话框 中有一个 AdMob 广告 通常 广告加载大约需要 4 或 5 秒的时间 并且由于它位于 对话框 中 因此用户很可能会在广告加载之前单击按钮 关闭对话框
  • 根据另一个键的值有条件地打印值

    下面是一些 JSON 示例 Tags Key Name Value foo Key Type Value C 我想仅当 Key 为 Type 时打印 Value 的值 所以它应该打印出 C 这是我到目前为止所拥有的 echo MY TAGS
  • 从应用程序类请求许可[重复]

    这个问题在这里已经有答案了 根据新的 Android 文档 为了收集某些数据 我需要请求许可 所以我正在这样做 Override public void onCreate super onCreate if PermissionUtilit
  • PySpark DataFrames - 无需转换为 Pandas 即可枚举的方法?

    我有一个很大pyspark sql dataframe DataFrame名为 df 我需要某种枚举记录的方法 因此 能够访问具有特定索引的记录 或选择具有索引范围的记录组 在熊猫中 我可以做 indexes 2 3 6 7 df inde
  • 多个背景图像 IE8

    是否有任何 jquery 插件 或任何其他方式 强制 IE8 显示多个背景图像 适用于 Internet Explorer 和旧版 Mozilla Firefox 的 CSS3 多种背景 该库通过从样式和链接标签读取 CSS 代码 为 In
  • Android模拟器:如何监控网络流量?

    如何监控从 Android 模拟器发送和接收的网络流量 捕获网络流量有两种方法directly从 Android 模拟器 复制并运行ARM 兼容的 tcpdump 二进制文件在模拟器上 将输出写入 SD 卡 也许 例如tcpdump s0
  • Visual Studio Code 的 Mac OS Mojave 麦克风权限

    我正在尝试使用 PyAudio 录制音频 但是在 VSCode 中工作时不会生成麦克风权限请求 我已经完成了 NVRAM 重置 这允许我通过终端运行脚本 在它生成权限请求之后 在隐私设置中 唯一可用的应用程序是 Chrome 和 Termi
  • 在 ruby​​ 上的模型中的方法之前调用

    这是我的实现 用于开发在模型中的所有方法之前运行代码的方法 调用 before hook months used 方法需要位于类的底部 以便 ExecutionHooks 可以获取模块中加载的instance method 我想在顶部加载实
  • 如何在 Avro 中定义 LogicalType。 (java)

    我需要能够标记 AVRO 模式中的某些字段 以便它们在序列化时进行加密 逻辑类型允许标记字段 并且与自定义转换一起应该允许它们由 AVRO 透明地加密 我在查找有关如何在 AVRO 中定义和使用新逻辑类型的文档时遇到了一些问题 avro 1
  • 从 MAKECMDGOALS 中删除目标?

    我的 makefile 中有以下内容 它是GNUmakefile 因此支持额外的 make 功能 Undefined Behavior Sanitzier Clang and G ifeq findstring ubsan MAKECMDG
  • 如何在asp.net MVC中将日期时间从视图传递到控制器

    我正在尝试将以下数据从我的视图传递给控制器 Edited
  • 列表视图中 Gridview 列的内容对齐

    Please see the picture below 以下是此代码
  • 纯C函数调用Objective-C方法?

    好吧 我已经阅读了关于这个主题的六篇帖子 但似乎没有一个解决方案能够满足确切的需求 问题 Pure C c 函数如何调用 Pure Objective C m 类中的方法 每个示例 答案都在 Objective C m 方法中使用 C 我有
  • 如何在 JavaScript 中将时间以毫秒为单位转换为小时、分钟、秒格式?

    我的时间为毫秒数 我想将其转换为HH MM SS格式 它应该环绕 与milliseconds 86400000我想要得到00 00 00 创建一个这样的函数怎么样 function msToTime duration var millise
  • PowerShell cmdlet 与 .NET 类

    编写 PowerShell 脚本时 有两个选项可用 Call a cmdlet Use the NET Framework 类库 在后台 cmdlet 很可能会利用 NET 库 从性能角度来看 在 Powershell 脚本中使用两者哪一个