【问题标题】:Command-line interface or PowerShell?命令行界面还是 PowerShell?
【发布时间】:2010-07-23 14:40:03
【问题描述】:

如果你要制作一个工具:

  1. 系统管理员会使用(例如系统监控或备份/恢复工具)
  2. 必须能够在 Windows 上编写脚本

你会做这个工具吗:

  1. 命令行界面工具?
  2. PowerShell cmdlet?
  3. 具有公共 API 的 GUI 工具?

我听说 PowerShell 在系统管理员中很受欢迎,但我不知道与 CLI 工具相比有多大。

【问题讨论】:

  • 顺便说一句,powershell 是一个事实上的 CLI 工具。

标签: command-line powershell


【解决方案1】:

PowerShell.

使用 PowerShell,您可以选择在 PowerShell 脚本或二进制 PowerShell cmdlet 中创建可重用命令。 PowerShell 专门为支持输出重定向以及轻松启动 EXE 和捕获其输出的命令行接口而设计的。 PowerShell IMO 最好的部分之一是它为您标准化和处理参数解析。您所要做的就是为您的命令声明参数,PowerShell 为您提供参数解析代码,包括对类型、可选、命名、位置、强制、管道绑定等的支持。例如,以下函数声明显示了这一点:

function foo($Path = $(throw 'Path is required'), $Regex, [switch]$Recurse)
{
}

# Mandatory
foo 
Path is required

# Positional
foo c:\temp '.*' -recurse

# Named - note fullname isn't required - just enough to disambiguate
foo -reg '.*' -p c:\temp -rec

PowerShell 2.0 高级功能提供了更多功能,例如参数别名-CN alias for -ComputerName、参数验证[ValidateNotNull()] 以及用于使用和帮助的文档集,例如:

<#
.SYNOPSIS
    Some synopsis here.
.DESCRIPTION
    Some description here.
.PARAMETER Path
    The path to the ...
.PARAMETER LiteralPath
    Specifies a path to one or more locations. Unlike Path, the value of 
    LiteralPath is used exactly as it is typed. No characters are interpreted 
    as wildcards. If the path includes escape characters, enclose it in single
    quotation marks. Single quotation marks tell Windows PowerShell not to 
    interpret any characters as escape sequences.
.EXAMPLE
    C:\PS> dir | AdvFuncToProcessPaths
    Description of the example
.NOTES
    Author: Keith Hill
    Date:   June 28, 2010    
#>
function AdvFuncToProcessPaths
{
    [CmdletBinding(DefaultParameterSetName="Path")]
    param(
        [Parameter(Mandatory=$true, Position=0, ParameterSetName="Path", 
                   ValueFromPipeline=$true, 
                   ValueFromPipelineByPropertyName=$true,
                   HelpMessage="Path to bitmap file")]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $Path,

        [Alias("PSPath")]
        [Parameter(Mandatory=$true, Position=0, ParameterSetName="LiteralPath", 
                   ValueFromPipelineByPropertyName=$true,
                   HelpMessage="Path to bitmap file")]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $LiteralPath
    )
    ...
}

了解属性如何让您更精细地控制 PowerShell 的参数解析引擎。另请注意可用于用法和帮助的 doc cmets,如下所示:

AdvFuncToProcessPaths -?
man AdvFuncToProcessPaths -full

这真的非常强大,也是我停止编写自己的小 C# 实用程序 exe 的主要原因之一。参数解析占代码的 80%。

【讨论】:

  • 如果 Windows 是目标,老实说,我认为没有比 PowerShell 更好的选择。就个人而言,我认为它最大的优势在于它使远程处理变得多么容易。我讨厌远程处理,因为根据我的经验,在启动它之前总是需要执行一个过程,这只是需要时间。现在有了 PowerShell,您只需 Enable-PSRemoting 就可以了。
  • 是的,PowerShell 有很多值得喜欢的地方,包括远程处理,但我的回答已经有点长了。 :-)
【解决方案2】:

我总是先创建一个命令行工具:

  • 与 GUI 相比,自动化/合并到脚本中要容易得多(比生成 API 的工作量要少得多)
  • 它几乎可以在所有 Windows 机器上运行(包括未安装 Power shell 的旧机器)

虽然 power shell 对系统管理员来说是一个很棒的工具,但我认为它的传播范围还不够广泛,无法避免同时产生传统命令行工具的需要——因此我总是首先制作一个命令行工具(尽管我也可能会选择继续生成 PowerShell cmdlet)。

同样,尽管经过深思熟虑的 API 可能更容易编写脚本,但您的 API 会限制用户可以使用哪些语言编写脚本,因此额外提供命令行工具作为备用/简单替代方案始终是一个好主意.

【讨论】:

    【解决方案3】:

    Python

    非常适合命令行应用程序和系统管理。比大多数 shell 更容易编码。此外,运行速度比大多数 shell 都要快。

    【讨论】:

    • 是,但未与 ms 软件集成(或易于集成)。
    • @x0n:什么?你有这方面的具体情况吗?这对我和整个 IronPython 社区来说都是新闻。
    • 嗯;我想你下意识的回答。我并不是说在语法上 powershell 是一种更好的语言(它不是),而是在其他方面:微软通用工程标准 (CEC) 是否指定所有微软产品都必须支持语言绑定和/或对 Ironpython 的集成支持?不,它适用于 powershell。
    • 细节:microsoft.com/cec/en/us/cec-overview.aspx#man-windows 这意味着实际上,几乎所有来自 redmond 的服务器产品都对 powershell 提供了第一类支持,包括 sharepoint、iis、sccm、exchange、cluster、sql 、activedirectory、dns、ocs、windows等
    • @x0n:我不明白你的第一个说法。您的第二个(“支持powershell”)似乎无关紧要-它似乎不支持您的第一个主张。您最初的声明“(未集成(或易于集成)”不太清楚。您是否有关于 Iron Python 与 MS 软件“未集成(或易于集成)”的详细信息?这就是我试图确定的说法。
    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2012-11-19
    相关资源
    最近更新 更多