【发布时间】:2011-06-24 03:21:33
【问题描述】:
我是一名称职的 C# 程序员,并且是 PowerShell 的新手。到底有什么好处呢?它更像是程序员的工具还是管理员的工具?
请分享您的经验。使用 .NET 程序集编写脚本何时比使用 C# 工具更容易?您将它用于哪些实际的生产任务?
也许问题应该是:与 C# 相比,对批处理有什么好处,而不是批处理?
【问题讨论】:
标签: .net scripting powershell
我是一名称职的 C# 程序员,并且是 PowerShell 的新手。到底有什么好处呢?它更像是程序员的工具还是管理员的工具?
请分享您的经验。使用 .NET 程序集编写脚本何时比使用 C# 工具更容易?您将它用于哪些实际的生产任务?
也许问题应该是:与 C# 相比,对批处理有什么好处,而不是批处理?
【问题讨论】:
标签: .net scripting powershell
对于可能需要频繁更改的小事情,我认为它比 C# 更好。
我主要将它用于部分构建和自动化设置。我更喜欢 PowerShell 的原因是我的脚本几乎总是需要一些来自 Visual Studio 的 DLL 文件。
现在,如果它是 C# 应用程序,当新版本的 Visual Studio 发布时,我需要使用新引用重新编译,然后将其发布到需要的任何地方。
但是,如果是 PowerShell,我可以简单地在脚本中更改 DLL 文件的路径,一切都很好。此外,我发现文件解析和其他 Perl-ish 类型的工作更容易使用。
【讨论】:
我已经创建了两个纯 PowerShell commandlet 并在 C# 中创建了一些。通常,我在 C# 中完成的那些更复杂,我发现使用类等构造多个文件更容易,以便以更好的方式维护代码。
与 PowerShell 相比,为 C# 项目创建测试也更容易,因为 C# 是 Visual Studio 中的一等公民,而 PowerShell 不是。
在 PowerShell 中完成这一切的好处是任何人都可以编辑您的脚本。
【讨论】:
它更像是一个系统管理员的工具,但只是一点点。
我会选择 PowerShell 而不是 C# 的地方是:
我们用它来自动化我们的通宵验收测试、编译结果、用最新的网页更新网页并通过电子邮件发送给相关团队。
请注意,NuGet 使用 PowerShell 自动将包添加/删除到您的解决方案中。 (并在此过程中公开了一个 PowerShell 控制台,供您自己自动化 Visual Studio。)
加上以交互方式发展脚本的能力,而不是编译语言中的写入→调试→修复循环,可以快速敲出简单的脚本。
【讨论】:
要编写 C# 工具,您通常需要设置 Visual Studio 项目(或其他 IDE 中的项目)。如果您“手动”执行此操作,则至少需要一个构建脚本来运行 C# 编译器。如果对于一项特定的任务,这似乎开销太大,而您只需要一个简单的单一文件源和程序是一体的解决方案,那么 PowerShell 脚本可能是更好的选择。
一些可能的原因:
【讨论】:
PowerShell 是一个强大的工具,您可以使用它来完成多个不同的任务,否则这些任务需要用户使用鼠标...(不仅如此)。
例如,最新版本的 Microsoft 服务器产品(如 SQL Server、Exchange、SharePoint 等)公开了一组丰富的 API,可轻松与 PowerShell 一起使用,因此,您可以使用 PowerShell 例如:
所有你以前无法通过批处理文件完成的事情。
【讨论】:
我是一名 C# 开发人员,从 PowerShell 的 beta 版本开始就一直在使用它,当时它仍被称为 Monad。我还在 UNIX 上进行了大量开发,包括使用 Korn Shell 进行自动化/脚本编写。对我来说,PowerShell 是天赐之物,因为我已经厌倦了 Korn Shell 与 Windows 的小阻抗不匹配。例如,指定网络共享路径特别严重 "\\\\\\server\\\\share" IIRC。根据字符串被评估的次数,你逃脱了多少次反斜杠有点猜谜游戏。
我将 PowerShell 用于许多自动化任务,例如:
要替换自定义命令行实用程序:
您可以使用 PowerShell 作为替代您曾经编写的所有那些小命令行实用程序的好方法。想想这个。 PowerShell 是一种相当强大的脚本语言,可让您访问大部分 .NET Framework。它特别擅长参数解析,即它具有内置的参数解析引擎,可为您提供:命名参数、位置参数、可选参数、开关参数、管道绑定参数、参数验证等。现在考虑一下典型命令行实用程序中有多少代码专用于参数解析与实际功能。我几乎已经停止编写命令行实用程序(除非它们特别复杂——那么你无法击败 VS 调试器)。我让 PowerShell 为我处理所有参数解析。使用 PowerShell 2.0,只需使用一些适当格式的 cmets 装饰您的脚本,就可以非常轻松地向您的实用程序添加文档/用法。
我还使用 PowerShell 作为 .NET REPL:
"{0,20:F1}" -f 41.22。您还可以利用在您自己的 C# 应用程序中轻松托管 PowerShell 引擎的优势。如果您向最终用户提供您希望使命令行可编写脚本的功能,这将派上用场。您可以将这些功能编写为 PowerShell cmdlet(在 C# 中)。然后可以直接从命令行使用这些 cmdlet,如果您在 GUI 应用程序中托管 PowerShell,则可以从那里访问同一组代码,例如:
private bool VerifyPowerShellScriptSignature(string path)
{
using (var runspaceInvoker = new RunspaceInvoke())
{
Collection<PSObject> results =
runspaceInvoker.Invoke("Get-AuthenticodeSignature " + path);
Signature signature = results[0].BaseObject as Signature;
return signature == null ? false :
(signature.Status == SignatureStatus.Valid);
}
}
【讨论】:
什么时候写一个更容易 使用 .NET 程序集而不是 C# 的脚本 工具?
啊,就是这样。 PowerShell 弥合了批处理文件和 .NET 世界之间的鸿沟。 PowerShell 回答了这个问题,“如果你要编写一个新的命令解释器,它具有 .NET 的所有功能,完全是动态的,并且几乎可以在命令 shell 中包含人们想要的大部分东西?”
那么你什么时候使用 PowerShell 而不是 C#?对于集成或编排其他应用程序的小型应用程序来说,它更方便——它更方便,因为您不必编译它,并且它已经有一种将数据传递给其他脚本和小脚本的标准方法,这很容易了解 PowerShell 的人。
【讨论】: