【问题标题】:What is PowerShell good for?PowerShell 有什么用?
【发布时间】:2011-06-24 03:21:33
【问题描述】:

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

请分享您的经验。使用 .NET 程序集编写脚本何时比使用 C# 工具更容易?您将它用于哪些实际的生产任务?

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

【问题讨论】:

标签: .net scripting powershell


【解决方案1】:

对于可能需要频繁更改的小事情,我认为它比 C# 更好。

我主要将它用于部分构建和自动化设置。我更喜欢 PowerShell 的原因是我的脚本几乎总是需要一些来自 Visual Studio 的 DLL 文件。

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

但是,如果是 PowerShell,我可以简单地在脚本中更改 DLL 文件的路径,一切都很好。此外,我发现文件解析和其他 Perl-ish 类型的工作更容易使用。

【讨论】:

    【解决方案2】:

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

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

    在 PowerShell 中完成这一切的好处是任何人都可以编辑您的脚本。

    【讨论】:

      【解决方案3】:

      它更像是一个系统管理员的工具,但只是一点点。

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

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

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

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

      加上以交互方式发展脚本的能力,而不是编译语言中的写入→调试→修复循环,可以快速敲出简单的脚本。

      【讨论】:

        【解决方案4】:

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

        一些可能的原因:

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

        【讨论】:

        • 谢谢,博士。但是启动 Visual Studio 通常没有问题。调试 C# 是不是比 powershell 容易很多?
        • 这对你来说可能不是问题,但对于网络管理员来说,这可能是一个真正的痛苦——随着问题变得越来越小,开销越来越大。
        • 您也可以调试 PowerShell。安装附带“Windows PowerShell ISE”,这是一个带调试功能的 IDE。当然不如 Visual Studio 舒服,但调试 PowerShell 脚本就足够了。
        • 作为一名分析师,powershell 非常强大,可以让我用最少的代码解析日志和其他功能。当我的其他分析师必须阅读我的代码并对其进行调整时,也更容易理解。
        【解决方案5】:

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

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

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

        所有你以前无法通过批处理文件完成的事情。

        【讨论】:

        • 那么它对自动化有好处吗?但是如何将 powershell 与 C# 进行比较呢?如果用 C# 编写一些代码不成问题,powershell 有什么优势?
        • 将powershell与C#进行比较没有意义,我们是否将命令提示符与Pascal进行比较?当您可以使用小型 powershell 脚本自动执行某些操作时,您就可以做到,而且您无需担心创建应用程序、窗口或控制台,以进行构建、编译和调试以获得相同的结果。
        【解决方案6】:

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

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

        • 在我想要搜索 CSPROJ 文件内容的大型源目录中搜索。
        • 我曾经使用 PowerShell 脚本修改了 260 多个 VCPROJ 文件。
        • 另外一次,我不得不创建一堆新的 C# 项目,每个项目都需要配置相当多的项目属性,包括大量代码分析调整。我编写了一个脚本来获取一个 C# 项目文件并为我做所有的调整。节省了我很多时间,更重要的是,避免了我犯很多错误和/或忘记设置某些设置
        • TFS 查询(使用 TFPT PowerShell cmdlet),例如在签入注释中使用特定单词搜索最近的变更集。
        • 删除特定文件夹层次结构中的所有临时文件(bin/obj 目录、suo 文件等)。

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

        您可以使用 PowerShell 作为替代您曾经编写的所有那些小命令行实用程序的好方法。想想这个。 PowerShell 是一种相当强大的脚本语言,可让您访问大部分 .NET Framework。它特别擅长参数解析,即它具有内置的参数解析引擎,可为您提供:命名参数、位置参数、可选参数、开关参数、管道绑定参数、参数验证等。现在考虑一下典型命令行实用程序中有多少代码专用于参数解析与实际功能。我几乎已经停止编写命令行实用程序(除非它们特别复杂——那么你无法击败 VS 调试器)。我让 PowerShell 为我处理所有参数解析。使用 PowerShell 2.0,只需使用一些适当格式的 cmets 装饰您的脚本,就可以非常轻松地向您的实用程序添加文档/用法。

        我还使用 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 的可能性!
        • +1 优秀的帖子。很好地描述了 Powershell 如何为 .net 开发人员提供便利
        【解决方案7】:

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

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

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

        【讨论】:

        • “...人(谁知道 PowerShell)”是您答案中的实际关键信息?
        猜你喜欢
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        相关资源
        最近更新 更多