命令行界面还是PowerShell?

4
如果你要制作一个工具,它需要满足以下条件:
1. 系统管理员会使用(例如系统监控或备份/恢复工具); 2. 必须在Windows上可编写脚本。
那么你会选择哪种工具类型呢?
1. 命令行接口工具? 2. PowerShell命令? 3. 具有公共API的GUI工具?
我听说PowerShell在系统管理员中很受欢迎,但我不知道与CLI工具相比有多受欢迎。

1
顺便提一下,PowerShell 是事实上的 CLI 工具。 - x0n
3个回答

11

PowerShell.

使用PowerShell,您可以选择在PowerShell脚本或二进制PowerShell cmdlet中创建可重用命令。PowerShell专门为命令行接口设计,支持输出重定向以及轻松启动EXE并捕获其输出。我认为最好的部分之一是,PowerShell标准化并处理了参数解析。你所要做的就是声明命令的参数,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替代-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参数解析引擎。还要注意可以用于用法和帮助的文档注释,如下所示:

AdvFuncToProcessPaths -?
man AdvFuncToProcessPaths -full

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


2
如果目标是Windows,我真的认为没有比PowerShell更好的替代品了。就个人而言,我认为它最大的优势在于使远程控制变得非常容易。由于我的经验中总是需要进行一些过程才能开始远程访问,这让我很讨厌。现在有了PowerShell,你只需要执行Enable-PSRemoting命令就行了。 - George Howarth
是的,PowerShell有很多优点,包括远程控制,但我的回答已经变得有点长了。 :-) - Keith Hill

0

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

  • 它比 GUI 更易于自动化 / 合并到脚本中(比编写 API 要少得多)
  • 它将运行在几乎所有的 Windows 机器上(包括未安装 PowerShell 的旧机器)

虽然 PowerShell 是系统管理员的一项伟大工具,但我认为它还没有普及到不再需要制作传统的命令行工具,因此我总是首先制作一个命令行工具(尽管我也可能选择继续制作 PowerShell cmdlet)。

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


-1

Python

非常适合命令行应用程序和系统管理。比大多数shell更容易编写。而且,运行速度比大多数shell更快。


是的,但不与微软软件集成(或易于集成)。 - x0n
我觉得你的回答有点草率。我并不是在说 PowerShell 在语法上更好(事实并非如此),但从其他方面来看:微软通用工程标准(CEC)是否规定所有微软产品必须支持 IronPython 的语言绑定和/或集成支持?并没有。但 PowerShell 却有这个规定。 - x0n
具体来说,http://www.microsoft.com/cec/en/us/cec-overview.aspx#man-windows 意味着在实际应用中,几乎每个从雷德蒙德发布的服务器产品都有对PowerShell的一流支持,包括SharePoint、IIS、SCCM、Exchange、Cluster、SQL、ActiveDirectory、DNS、OCS、Windows等等。 - x0n
@x0n:我不理解你的第一个论点。你的第二个论点(“支持PowerShell”)似乎与第一个论点无关,它似乎并不能支持你的第一个论点。你最初的论点“(不是集成的(或易于集成的)”不太清楚。你有关于Iron Python与微软软件“不是集成的(或易于集成的)”的具体细节吗?那就是我试图了解的论点。 - S.Lott
澄清一下:支持 = 集成。集成 = 提供二进制模块或 Snapin,以呈现面向任务的本机 cmdlet 供 PowerShell 使用。据我所知,微软内部没有任何团队为其产品提供本机 IronPython 绑定。PowerShell 和 IP 都可以使用 CLR,但编写 .NET 调用比编写 PowerShell cmdlet 更容易。清楚了吗? - x0n
显示剩余4条评论

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