PowerShell有什么好处?

12

我是一名熟练的C#程序员,但对PowerShell还比较陌生。它有什么用处?更适合于程序员还是管理员使用?

请分享您的经验。在什么情况下编写一个使用.NET程序集的脚本比编写C#工具更容易?您用它来处理哪些真正的产品任务?

也许问题应该是:与C#相比,它有什么优点,而不是与批处理相比?


可能是如何使用PowerShell?的重复问题。 - Helen
7个回答

8
当使用.NET程序集比使用C#工具更容易编写脚本时,您希望使用哪种方式呢?
噢,我明白了。PowerShell连接批处理文件和.NET世界之间的鸿沟。PowerShell回答了这个问题:“如果你要编写一个新的命令解释器,它具有.NET的所有功能,是完全动态的,并且基本上拥有人们在命令行中想要的大多数功能,会怎样呢?”
那么,何时使用PowerShell而不是C#?对于集成或编排其他应用程序的小型应用程序,它更加方便 - 这是因为您不必编译它,并且它已经有一种标准的方法来传递数据到其他脚本和脚本片段,这对于熟悉PowerShell的人来说很容易理解。

你的答案中,“熟悉PowerShell的人”是实际关键信息。 - Romain Vincent

7
我是一名C#开发人员,自从PowerShell还叫Monad的beta版本时就开始使用它了。我也在UNIX上进行了相当多的开发,包括使用Korn Shell进行自动化/脚本编写。对我而言,PowerShell是一种救星,因为我已经厌倦了Korn Shell在Windows上的小阻碍。例如,指定网络共享路径特别麻烦,"\\\\\\server\\\\share"(如果我没记错的话)。这是一个猜测游戏,取决于字符串被评估的次数,你需要猜测反斜杠需要转义多少次。
我使用PowerShell执行许多自动化任务,例如:
  • 在一个大的源目录中使用Grepping搜索CSPROJ文件的内容。
  • 我曾经用PowerShell脚本修改了260多个VCPROJ文件。
  • 另一次,我需要创建一堆新的C#项目,每个项目都有相当数量的项目属性需要配置,包括很多代码分析调整。我编写了一个脚本,以基础的C#项目文件为模板,并对所有调整进行处理。这为我节省了大量时间,更重要的是,避免了犯很多错误和/或忘记设置某些设置。
  • TFS查询(使用TFPT PowerShell cmdlet)例如搜索具有特定单词的最近更改集的签入注释。
  • 删除特定文件夹层次结构中的所有临时文件(bin/obj dirs,suo文件等)。

代替自定义命令行实用程序:

您可以使用PowerShell来替代之前编写的各种小型命令行实用程序。 PowerShell是一种相当强大的脚本语言,可让您访问大多数.NET Framework。它特别擅长参数解析,即它具有内置的参数解析引擎,可为您提供:命名参数、位置参数、可选参数、开关参数、管道绑定参数、参数验证等功能。现在考虑一下,在您典型的命令行实用程序中,有多少代码是专门用于参数解析而不是实际功能。我几乎停止编写命令行实用程序(除非它们特别复杂-那么您无法击败VS调试器)。然后我让PowerShell为我处理所有参数解析。并且使用PowerShell 2.0非常容易通过在脚本中添加一些适当格式化的注释来为您的实用程序添加文档/用法。
我还将PowerShell用作.NET REPL:
消除了创建ConsoleApplication59来查看格式化字符串的需求,例如,我只需转到PowerShell提示符并尝试类似于"{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);
        }
    }

PowerShell 2.0 还增加了超级强大的 Add-Type Cmdlet,可以让用户将 JIT 编译的 CLR 代码直接集成到 PowerShell 中的多种语言中,甚至还可以添加 P/Invoke 的可能性! - Thomas S. Trias
+1 很棒的帖子。很好地描述了Powershell如何对.NET开发人员有用。 - Amit Sharma

6
为了编写一个C#工具,通常需要设置一个Visual Studio项目(或其他IDE中的项目)。如果您手动完成这个过程,至少需要一个构建脚本来运行C#编译器。如果对于特定任务来说,这似乎是太多的开销,并且您只需要一个简单的一文件源代码和程序都在一个解决方案中,那么PowerShell脚本可能是更好的选择。
一些可能的原因包括:
- 您的计算机上没有安装Visual Studio(或任何其他C# IDE),或者您根本不熟悉它(就像许多系统管理员一样)。 - 程序非常小,您不需要调试器。一些简单的控制台输出就可以了。 - 您不想维护多个文件。 - 您不想将工具的配置参数放入单独的配置文件中。 - 当您可以定义单独的任务,但无法确定确切的工作流程时,脚本和C#的混合是理想的。在C#中创建cmdlet或提供程序可以使您的脚本以一般方式访问任何内容,而PowerShell则成为粘合剂,使工作流程适应新情况变得灵活。 - 您有几个竞争的总体设计思路,并且希望快速测试可行性的可能性。PowerShell的软类型和管道架构使得忽略控制结构和类型细节中的许多模糊点并找到算法的核心变得容易。

谢谢,Doc。但是启动Visual Studio通常不是问题。调试C#比PowerShell简单得多,不是吗? - zzandy
2
对于你来说可能不是问题,但对于网络管理员而言,随着问题变得越来越小和简单,额外开销的数量会变得更加沉重。 - Dave Markle
2
你也可以调试PowerShell。安装包含“Windows PowerShell ISE”,这是一个带有调试功能的IDE。当然,它不像Visual Studio那样舒适,但足以调试PowerShell脚本。 - Christian Specht
作为一名分析师,PowerShell 在让我解析日志等方面非常强大,而且只需很少的代码。此外,当我的其他分析师需要阅读和调整我的代码时,它更容易理解。 - Robert Cotterman

2

PowerShell是一种强大的工具,您可以使用它完成多种不同的任务,否则这些任务需要用户使用鼠标...(不仅限于此)。

例如,最新版本的Microsoft服务器产品如SQL Server、Exchange、SharePoint等都公开了丰富的API,可以轻松地与 PowerShell 一起使用,在这种情况下,您可以使用 PowerShell 来:

  • 在SQL Server中附加、分离、备份、还原数据库;
  • 操作Exchange邮箱;
  • 等等。

所有这些都是以前无法从批处理文件中完成的事情。


那么它适合自动化吗?但是将PowerShell与C#进行比较呢?如果用C#编写代码不成问题,那么PowerShell有什么优势呢? - zzandy
在编程方面,将PowerShell与C#进行比较是没有意义的。这就好比我们要用Pascal来比较命令提示符一样。当你能够使用一个小的PowerShell脚本自动化某些事情时,你可以这么做,而且你无需担心创建应用程序、Windows或控制台,并进行构建、编译和调试才能达到相同的结果。 - Davide Piras

2

它更适合系统管理员使用的工具,但只是稍微。

我会选择PowerShell而不是C#的地方是:

  • 任何需要运行外部应用程序的地方
  • 任何需要处理自动化API的地方...
  • 任何你正在操作文件的地方

我们用它来自动化我们的夜间验收测试,编译结果,更新网页和发送电子邮件给相关团队。

请注意,NuGet使用PowerShell自动添加/删除软件包到您的解决方案中。(在此过程中为您提供一个PowerShell控制台,以便您自己自动化Visual Studio。)

另外,与编译语言中的编写→调试→修复循环相比,可以交互地发展脚本,这使得快速编写简单脚本变得更容易。


2

我曾经使用纯PowerShell命令和C#创建了一些命令。通常情况下,我在C#中创建的命令更加复杂,我发现构建几个包含类等文件可以更轻松地维护代码。

与PowerShell相比,对于C#项目而言,更容易创建测试,因为C#是Visual Studio中的一级公民,而PowerShell不是。

全部使用PowerShell的优点在于任何人都可以编辑你的脚本。


2

我认为PowerShell比C#更适合需要频繁更改的小事情。

我主要将其用于我的构建和自动化设置的部分。之所以我喜欢PowerShell,是因为我的脚本几乎总是需要来自Visual Studio的某些DLL文件。

现在,如果是C#应用程序,当新版本的Visual Studio推出时,我需要使用新的引用重新编译,然后将其发布到需要的所有地方。

但是,如果是PowerShell,我只需更改脚本中DLL文件的路径,一切都没问题。此外,我发现它在文件解析和其他Perl式类型工作方面更易于使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接