什么是PowerShell有用?

时间:2011-02-09 13:15:54

标签: .net scripting powershell

我是一位称职的C#程序员,也是PowerShell的新手。到底有什么好处呢?它更像是程序员的工具还是管理员的?

请分享您的经验。何时使用.NET程序集编写脚本比使用C#工具更容易?你用它做什么真正的生产任务?

也许问题应该是:与C#相比有什么好处,而不是批次

7 个答案:

答案 0 :(得分:7)

  

什么时候写一个更容易   使用.NET程序集的脚本而不是C#   工具

啊,看,就是这样。 PowerShell弥补了批处理文件和.NET世界之间的鸿沟。 PowerShell回答了这个问题,“如果你要编写一个具有.NET所有功能的新命令解释器,那么它是完全动态的,并且在命令shell中几乎拥有人们想要的大部分内容?”

那么你什么时候使用PowerShell而不是C#?对于集成或编排其他应用程序的小型应用程序来说更方便 - 它更方便,因为您不必编译它,并且它已经有一种将数据传递给其他脚本和scriptlet的标准方法,这很容易知道PowerShell的人(知道PowerShell)。

答案 1 :(得分:7)

我是一名C#开发人员,并且自从测试版以来它一直在使用PowerShell,它仍被称为Monad。我还在UNIX上进行了大量的开发,包括使用Korn Shell进行自动化/脚本编写。对我来说,PowerShell是一个天赐之物,因为我对Korn Shell与Windows的小阻抗不匹配感到厌倦。例如,指定网络共享路径特别严重"\\\\\\server\\\\share" IIRC。根据字符串被评估的次数,你有多少次使用反斜杠来猜测游戏。

我将PowerShell用于许多自动化任务,例如:

  • 浏览我想要搜索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);
        }
    }

答案 2 :(得分:6)

编写C#工具时,通常需要设置Visual Studio项目(或另一个IDE中的项目)。如果您“手动”执行此操作,则至少需要一个构建脚本来运行C#编译器。如果对于特定任务而言这似乎是一个过多的开销,并且您只需要一个简单的单文件源和程序是一体化解决方案,那么PowerShell脚本可能是更好的选择。

一些可能的原因:

  • 您的计算机上没有安装Visual Studio(或任何其他C#IDE),或者根本不习惯它(像许多系统管理员一样)
  • 程序太小,不需要调试器。一些简单的控制台输出就可以实现。
  • 您不想保留多个文件。
  • 您不希望将工具的配置参数放入单独的配置文件中。
  • 当您可以定义单个任务但无法确定确切的工作流程时,脚本和C#的混合是理想的。在C#中创建cmdlet或提供程序使您的脚本能够以一般方式访问任何内容,PowerShell成为粘合剂,使工作流程适应新环境。
  • 您有几个相互竞争的总体设计理念,您希望快速测试可行性的可能性。 PowerShell的软打字和管道架构使得很容易忽略控制结构和类型细节的许多变幻莫测,并深入了解算法的核心。

答案 3 :(得分:2)

PowerShell是一个功能强大的工具,可用于完成多个不同的任务,否则需要用户使用鼠标......(不仅仅是)。

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

  • 在SQL Server中附加,分离,备份,还原数据库;
  • 操纵Exchange邮箱;
  • 以及更多。

以前只能从批处理文件中执行的所有操作。

答案 4 :(得分:2)

这是一个系统管理员工具,但只是略有一点。

我选择支持的地方比如C#是:

  • 您可能想要运行外部应用的任何地方
  • 您想要处理自动化API的任何地方......
  • 您操作文件的任何地方

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

请注意,NuGet使用Powershell自动添加/删除解决方案包。 (并且在此过程中为您公开了一个PowerShell控制台,以便您自动自动化Visual Studio。)

另外还能够以交互方式演变脚本,而不是写入 - &gt;调试 - &gt;你用编译语言修复的循环可以快速敲出简单的脚本。

答案 5 :(得分:2)

我创建了两个纯PowerShell命令行开关,并在C#中创建了一些。通常,我在C#中完成的操作更复杂,我发现使用类等构造多个文件更容易,以便以更好的方式维护代码。

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

在PowerShell中完成所有操作的好处是任何人都可以编辑脚本。

答案 6 :(得分:2)

我认为对于小事来说,它比C#更好,可能需要经常更改。大多数情况下,我将它用于构建和自动化设置的一部分。我更喜欢PowerShell的原因是我的脚本几乎总是需要Visual Studio中的一些dll。现在,如果它是一个C#应用程序,当新版本的visual studio出现时,我需要使用新的引用重新编译,然后将它发布到它需要的任何地方。但是,如果它是powershell,我可以简单地在脚本中更改dll的路径,一切都很好。此外,我发现使用文件解析和其他perl-ish类型的工作要容易得多。