PowerShell是否准备在Windows上替换我的Cygwin shell ?

我在争论我是否应该学习PowerShell,或者只是坚持使用Cygwin/Perl脚本/Unix shell脚本,等等。

PowerShell的好处是,没有Cygwin的队友可以更容易地使用脚本;然而,我不知道我是否真的会写那么多通用脚本,或者人们是否会使用它们。

Unix脚本功能如此强大,PowerShell是否足以让我们切换到它呢?

以下是我在PowerShell中寻找的一些具体内容(或等效内容):

  • grep
  • 排序
  • uniq
  • Perl (PowerShell与Perl的能力有多接近?)
  • AWK
  • sed
  • File(提供文件信息的命令)
  • 等。
122722 次浏览

我已经使用了一些PowerShell来实现脚本自动化。虽然环境看起来比Unix shell考虑得更周到,但实际上使用对象而不是文本流要笨拙得多,而且过去30年开发的许多Unix设施仍然缺失。

Cygwin仍然是我在Windows主机上选择的脚本环境。在完成任务方面,它肯定胜过其他选择。

如果你喜欢shell脚本,你一定会爱上PowerShell!

微软命令Shell的导游 (Ars Technica)开始。

当您将PowerShell与Cygwin/Perl/Shell组合进行比较时,请注意PowerShell仅表示该组合的“Shell”部分。

然而,您可以从PowerShell调用任何命令,就像从cmd.exe或Cygwin中调用一样。它确实重新实现了指定的函数,而且它肯定不能与Perl相比。

它“只是”一个外壳,但它使编程变得更容易,为。net世界提供了一个舒适的接口。

还要记住,PowerShell需要Windows XP、Windows Server 2003或更高版本,这可能会造成问题,具体取决于您的IT基础设施。

更新:

我不知道我的回答会引发什么样的哲学辩论。

我在这个问题的背景下发布了我的答案:将PowerShell与Cygwin、Perl和Bash进行比较。

PowerShell是一个shell,因为它在内置命令、命令行、用户函数和外部命令(.exe、.bat、.cmd)之间没有语法上的区别。只有在调用中添加名称空间或对象才能调用。net方法。

它的可编程性来源于。net框架,而不是任何特定于PowerShell“语言”的东西。

我想说我相信PowerShell是一种“脚本语言”,只要BugzillaMediaWiki被实现为运行在web服务器上的PowerShell脚本;)

在那之前,享受比较

无论如何,我都不是一个非常有经验的PowerShell用户,但是我接触到的一点点PowerShell给我留下了深刻的印象。您可以将内置的cmdlet链接在一起,以完成您在Unix提示符下可以完成的任何事情,并且还有一些额外的优点,用于执行诸如导出到CSV、HTML表以及更深入的系统管理类型的作业。

如果你真的需要像sed这样的东西,总有UnixUtilsGnuWin32,你可以相当容易地与PowerShell集成。

作为一个长期的Unix用户,我在习惯命令命名方案时遇到了一些麻烦,如果我了解更多的。net,我肯定会从中受益更多。

所以本质上,我认为如果windows独有的特性不构成问题,它是非常值得学习的。

我还没有看到PowerShell真正流行起来,至少现在还没有。因此,除非团队中的其他人已经知道它,否则学习它可能不值得。

对于您的困境,您最好使用其他人可以支持的脚本语言,如您提到的Perl或Ruby或Python。

我认为这在很大程度上取决于你需要做什么。就我个人而言,我一直在为自己的个人脚本使用Python,但我知道当我开始编写一些东西时,我永远无法将其传递下去——所以我尽量不做任何太有革命性的事情。

grep

Select-String cmdlet和-match操作符使用正则表达式。此外,您还可以直接使用. net的正则表达式支持来实现更高级的功能。

排序

Sort-Object更强大(比我记得*nix的sort更强大)。允许对任意表达式进行多级排序。在这里,PowerShell对底层类型的维护有所帮助;例如,DateTime属性将被排序为DateTime,而不必确保格式化为可排序格式。

uniq

Select-Object -Unique

Perl (PowerShell的功能有多接近Perl ?)

就Perl领域特定支持库的广度而言:还远远不及(目前)。

对于通用编程来说,PowerShell当然更具有内聚性和一致性,也更容易扩展。文本修改的一个空白是等价于Perl的..操作符。

AWK

自从使用AWK以来已经足够长了(肯定是>18年了,因为后来我只使用Perl),所以不能真正评论。

sed

(见上图)

File(提供文件信息的命令)

PowerShell的优势并不在于它可以对文件系统对象做什么(它在这里获得了全部信息,dir返回FileInfoFolderInfo对象),而是它是整个提供者模型。

您可以将注册表、证书存储、SQL Server、internet Explorer的RSS缓存等视为一个对象空间,可以通过与文件系统相同的cmdlet进行导航。


PowerShell绝对是Windows的发展方向。微软已经将其列为未来非家用产品的要求之一。因此在Exchange中有丰富的支持,在SQL Server中有支持。这个只会膨胀。

最近的一个例子是TFS PowerToys。许多TFS客户端操作都不需要每次启动tf.exe(这需要一个新的TFS服务器连接等),并且更容易进一步处理数据。以及允许广泛访问整个TFS客户端API,以比在TF.exe的任何团队资源管理器中公开的更详细的信息。

工具只是工具。
他们要么帮忙,要么不帮忙。
你需要帮助或者不需要。

如果你知道Unix,并且这些工具能在Windows上做你需要它们做的事情——那么你是一个快乐的家伙,没有必要学习PowerShell(除非你想探索)。

我最初的意图是在Windows中包含一组Unix工具,然后就完成它(我们团队中的许多人都有深厚的Unix背景,并且对该社区非常尊重)。

我发现这并没有多大帮助。原因是AWK/grep/sed不能针对COMWMIADSI,注册表,证书存储等等。

换句话说,UNIX是一个围绕文本文件自调的完整生态系统。因此,文本处理工具是有效的管理工具。Windows是一个完全不同的生态系统,围绕api和对象进行自我调整。这就是我们发明PowerShell的原因。

我想你会发现,在很多情况下,文本处理并不能在Windows上得到你想要的东西。这时,您将想要选择PowerShell。注意-这不是一个全有或全无的交易。在PowerShell中,您可以调用Unix工具(并使用它们的文本处理或PowerShell的文本处理)。你也可以从Unix工具中调用PowerShell来获取文本。

再次强调,这里没有宗教信仰,我们的重点是为您提供成功所需的工具。这就是为什么我们如此热衷于反馈。让我们知道我们在工作中哪里失败了,或者你在哪里没有你需要的工具,我们会把它列在清单上,然后开始处理。

坦率地说,我们正在从30年的坑里挖出来,所以还需要一段时间。也就是说,如果你拿起Windows Server 2008 /R2的测试版和/或我们的服务器产品的测试版,我想你会惊讶于这个洞被填满的速度有多快。

至于使用情况,到目前为止我们已经有350万次下载量。这并不包括在Windows Server 2008中使用它的人,因为它是作为可选组件包含的,不需要下载。

V2将在所有版本的Windows中发布。它将在默认情况下开启所有版本,除了服务器核心,在那里它是一个可选组件。在Windows 7/Windows Server 2008 R2发布后不久,我们将在所有平台上提供V2, Windows XP及以上版本。换句话说,您在学习方面的投资将适用于非常多的机器/环境。

最后一个评论。如果/当你开始学习PowerShell,我想你会很开心的。大部分设计都受到我们Unix背景的严重影响,所以虽然我们非常不同,但你会很快学会(在你不再抱怨它不是Unix之后:-))。

我们知道人们用于学习的预算非常有限——这就是为什么我们非常重视一致性。你会学到一些东西,然后你会一遍又一遍地使用它。

实验!享受吧!参与!

我发现PowerShell编程不值得付出努力。

我有几年在Unix下编写shell脚本的经验,但是我发现用PowerShell做任何事情都非常困难。

似乎许多函数都需要您查询Windows管理界面并发出类似sql的命令来获得所需的信息。

例如,我想写一个脚本从目录树中删除具有特定后缀的所有文件。在Unix下,这将是一个简单的…

find . -name \*.xyz -exec rm {} \;

经过几个小时的Scripting.FileSystemObjectWScript.Shell,并发出“SELECT * FROM Win32_ShortcutFile WHERE Drive = '”&开车,"' AND Path = '" &searchFolder,“'”,我最终放弃了,并解决了Windows资源管理器的搜索命令,只需手动执行。可能有一些方法可以做到我想要的,但我没有看到任何明显的东西,MSDN网站上的所有示例都是如此微不足道,以至于毫无价值。

编辑嘿,当然,当我写这篇文章的时候,我又翻了一下,发现了我遗漏的东西:删除项命令的-recurse选项是错误的(如果你使用get-help remove-item -detailed,就会显示出来)。

我一直在尝试“remove-item -filter '* .xyz' -recurse”,但它不起作用,所以我放弃了它。

结果你需要使用get-childitem -filter '*.xyz' -recurse | remove-item

PowerShell功能非常强大,比Unix shell的标准内置功能更强大(但这只是因为它包含了许多通常分配给子程序的功能)。另外,考虑到你可以用任何。net语言编写applet,包括IronPythonIronRuby, PerlNet等等。或者你可以简单地从PowerShell调用你的Cygwin命令,忽略所有额外的功能,它将类似于Bash, KornShell,或任何…

作为一个从1997年到2010年专注于Windows企业开发的人,显而易见的答案是PowerShell,因为前面给出的所有好的理由(例如,它是微软企业战略的一部分;与Windows/COM/.NET集成良好;使用对象而不是文件提供了一个“更丰富的”编码模型)。出于这个原因,我在过去两年左右的时间里一直在使用和推广PowerShell,并明确地相信我是在遵循“比尔之言”。

然而,作为一个实用主义者,我不再确定PowerShell是一个很好的答案。虽然这是一款出色的Windows工具,并且为填补Windows命令行这一历史性的漏洞提供了非常必要的一步,但我们都看到微软对消费者计算的控制正在下滑,微软似乎越来越有可能面临一场大规模的战斗,以保持其操作系统对未来企业的重要性。

事实上,鉴于我发现我的工作越来越多地处于不同的环境中,我发现目前使用Bash脚本要有用得多,因为它们不仅可以在Linux、Solaris和Mac OS X上工作,而且还可以在cygwin的帮助下在Windows上工作。

因此,如果您相信操作系统的未来是商品化的,而不是垄断的,那么选择一种灵活的开发工具策略,在可行的情况下远离专有工具似乎是有意义的。然而,如果你认为你的未来被所有的雷德蒙德所主宰,那么就选择PowerShell吧。

您也可以尝试在Windows上使用BashWin at运行Bash脚本 https://github.com/skanga/BashWin . < / p >

PowerShell中的cmdlet非常好,工作可靠。因为我是一名Java/ c#开发人员,所以它们的面向对象性非常吸引我,但这并不是一个完整的集合。由于它是面向对象的,它错过了很多POSIX工具集的文本流成熟度(比如awksed)。

对于既喜欢OO技术又喜欢POSIX工具的成熟,我发现最好的答案是两者都用!PowerShell的一个优点是它出色地将对象输送到标准流。PowerShell默认使用对象管道来传输它的对象。这些不是标准流(标准输出、标准错误和标准输入)。当PowerShell需要将输出传递给一个没有对象管道的标准进程时,它首先将对象转换为文本流。由于PowerShell在这方面做得很好,所以它是一个托管POSIX工具的绝佳场所!

最好的POSIX工具集是GnuWin32。它确实需要超过5秒的时间来安装,但这是值得的,据我所知,它不会修改你的系统(注册表,c:\windows\*文件夹等),除了将文件复制到你指定的目录。这是非常好的,因为如果您将工具放在共享目录中,许多人可以同时访问它们。

GnuWin32安装说明

下载并执行exe(它来自SourceForge网站),将其指向合适的目录(我将使用C:\bin)。它会在那里创建一个GetGnuWin32目录,你将在其中运行download.bat,然后运行install.bat(不带参数),在这之后,会有一个C:\bin\GetGnuWin32\gnuwin32\bin目录,这是Windows机器上曾经存在过的最有用的文件夹。将该目录添加到路径中,就可以开始了。

在几行中,Cygwin和PowerShell是不同的工具,但是如果你安装了Cygwin,你可以在PowerShell会话中运行Cygwin可执行文件。我已经习惯了PowerShell,现在我不再使用grep, sort, awk等。在PowerShell中有很多内置的替代方案,如果没有,您可以在那里找到cmdlet。

我发现自己使用的主要工具是ssh.exe,但是在PowerShell会话中。

效果很好。

为什么不两者都用呢?在Cygwin中调用PowerShell脚本,就像其他解释性脚本(如Perl)一样。

我这样做,以至于我为Bash包装器编写了https://bitbucket.org/jbianchi/powershell,以便在Cygwin中调用powershell.exe。它可以作为工作作为PowerShell .exe .ps1脚本的第一行(因为PowerShell也使用“#”作为注释)。有关示例请参见https://bitbucket.org/jbianchi/powershell/wiki/Home

我直到最近才开始认真地接触PowerShell。尽管在过去的7年里,我一直在一个几乎完全基于Windows的环境中工作,但我有Unix背景,我发现自己一直在努力将我在Windows上的交互体验“Unix化”。至少可以说,这令人沮丧。

将PowerShell与Bashtcshzsh这样的东西进行比较是公平的,因为像grepsedawk找到这样的实用程序,严格地说,不是shell的一部分;然而,它们将永远是任何Unix环境的一部分。也就是说,像选择string这样的PowerShell命令具有与grep绑定为PowerShell核心模块非常相似的功能……所以界限可能有点模糊。

我认为关键是文化,以及各自的工具集将体现各自的文化这一事实:

  • Unix是一个基于文件的(通常是非Unicode)的基于文本的文化。配置文件几乎都是文本文件。另一方面,Windows在配置格式方面一直更加结构化——配置通常保存在专有数据库中(例如,Windows注册表),需要专门的工具来管理。
  • Unix管理(以及多年来的开发)界面传统上是命令行和虚拟终端。Windows开始作为一个GUI和管理功能最近才开始远离专门基于GUI。我们可以期待Unix在命令行方面的经验会更丰富、更成熟,因为它在PowerShell上有显著的领先优势,而我的经验与此相符。在这一点上,根据我的经验:

    • Unix管理经验是为了使事情在最少的击键中容易完成;这可能是由于必须通过缓慢的9600波特拨号连接来管理服务器的历史情况。现在PowerShell确实有别名,可以很好地绕过相当冗长的Verb-Noun标准,但要了解这些别名有点痛苦(有人知道比alias | where {$_.ResolvedCommandName -eq "<command>"}更好的吗?)

      历史可以被操纵的丰富方式的一个例子:

      iptables命令通常很冗长,如果不是为了Bash中内置的历史操作的许多整洁特性之一,重复它们会很痛苦,所以插入如下的iptables规则:

      iptables -I camera-1-internet -s 192.168.0.50 -m state --state NEW -j ACCEPT

      另一个相机("camera-2")的第二次,只是一个发出的情况:

      !!:s/-1-/-2-/:s/50/51

      这意味着“执行前面的命令,但是用-2-替换-1-,用51替换50

      ?
    • Unix体验是为触摸打字员优化的;一个人几乎可以不离开“家”的位置做任何事情。例如,在Bash中,使用Emacs键绑定(是的,Bash也支持vi绑定),循环使用Ctrl-PCtrl-N,同时移动到一行的开始和结束分别使用Ctrl-ACtrl-E…而且绝对不会就此结束。即使是在PowerShell控制台中尝试最简单的导航,而不从主位置移动,您也会遇到麻烦。

    • 像Unix上的通用分页(a la )这样的简单功能在PowerShell中似乎无法开箱即用,这有点令人沮丧,而且丰富的编辑器体验也不存在。当然,人们总是可以下载第三方工具来填补这些空白,但如果这些东西就像它们在任何Unix上一样“存在”,那就太好了。
    • 李< / ul > < / >
    • Windows文化,至少在系统API方面很大程度上是由支持框架驱动的,即COM。NET,两者都是高度结构化和基于对象的。另一方面,对Unix api的访问传统上是通过文件接口(/dev/proc)或(非面向对象)c风格的库调用。因此,脚本体验与它们各自的操作系统范例相匹配就不足为奇了。PowerShell本质上是结构化的(所有东西都是一个对象),基于Bash and friends文件。PowerShell程序员可以使用的结构化API非常庞大(本质上与现有的标准COM和. net接口的庞大集相匹配)。

    简而言之,虽然PowerShell的脚本功能可以说比Bash更强大(特别是当你考虑到。net 基类库的可用性时),但互动的体验明显较弱,特别是如果你从完全由键盘驱动、基于控制台的角度(就像许多unix头一样)来使用它。

TL;DR——我不讨厌Windows或PowerShell。我只是不能任何在Windows或PowerShell。


我个人仍然觉得PowerShell充其量只能说是平淡无奇。

  • TAB补全目录路径不复合,要求用户在每次名称补全后输入路径分隔符。
  • 我仍然觉得Windows甚至没有路径的概念,或者路径是什么,没有可访问的用户主页指示器~/,除了一些@environment://somejibberish/%user_home%
  • NTFS仍然是一个烂摊子,似乎永远都会是。祝你航行好运。

  • 在PowerShell中仍然可以看到恐龙cmd.exe, Edit标记仍然是复制信息的唯一方式,并且只能以矩形块的形式复制可见的终端空间。and Edit标记仍然是将字符串粘贴到终端的唯一方法。

  • 把它涂成蓝色并不会让它更有吸引力。不过,我并不介意微软开发人员对颜色有所偏好。

  • 窗口总是在屏幕的左上角打开。对于那些使用垂直任务栏的人来说,这是非常恼人的,特别是考虑到Windows任务栏将覆盖窗口中唯一允许访问复制/粘贴功能的角落。

关于Windows包含的工具,我不能说太多。由于有一整套开源的、免费授权的CLI工具,而且PowerShell附带了这些工具,据我所知,没有一个是完全令人失望的。

  • PowerShell的wget接受了与GNU wget相似的参数。谢谢,希望之光便携无用。
  • PowerShell POSIX与bash不兼容,特别是&&运算符没有被处理,使得最简单的条件命令后面没有任何东西。

我不了解人类;我试过了,真的;我仍然试着给它一个机会,希望下次我打开它的时候,它不会那么无用。我不能在PowerShell中做任何事情,我也几乎不能在真正的项目中将GNU工具引入Windows。

MySysGit为我提供了带有几个GNU工具的陈旧cmd.exe提示符,它仍然非常令人印象深刻,但最终路径补全工作了。Git命令将在Git Bash中运行。

Mintty for MySysGit为MySysGit的环境提供了Cygwin界面,使复制和粘贴一个东西(选择复制(鼠标),转变+Ins粘贴,多么现代……)然而,像git push这样的东西在Mintty中被破坏了。

我并不是要抱怨,但我仍然看到Windows上命令行可用性的巨大问题,即使使用了Cygwin这样的工具。


注:仅仅因为在PowerShell中完成了可以,并不意味着它就是可用的。可用性比能力更重要,这也是我作为消费者在使用产品时所关注的问题。

由于我最近的实验将我带入了PowerShell和. net调用的深度,我必须说PowerShell 可以取代了Cygwin和Unix shell。

我对Perl不太确定,但由于PowerShell和Perl作为编程语言都是图灵完备的,所以我认为也可以取代Perl。

PowerShell优于Cygwin和*nix下的普通Bash的一点是,它能够执行沙盒DLL调用,通过直接API调用、WMI方法甚至COM对象操纵操作系统。如何通过代码启动internet Explorer,然后对其显示的文档做任何你想做的事情,有效地模拟Web服务器的后端?

如何从SQL服务器和其他数据提供者收集数据,解析它们并导出为CSV、邮件消息、文本以及任何现有和不存在的文件格式?(当然,使用适当的技能从接收到的数据中创建有效的文件,但CSV是现成的)。

有一个额外的安全可用通过签名cmdlet和脚本, 组策略,以及防止恶意代码在您的系统上运行的执行策略,即使您以管理员身份运行

关于执行什么命令——Richard的回答列出了它们以及PowerShell已经能够模拟它们的功能。

关于PowerShell是否强大到可以保证切换-这更多的是个人偏好的问题,尽管越来越多的Windows服务提供PowerShell cmdlet来控制它们,不使用这些服务的PowerShell被认为是一个障碍。(Hyper-V服务器是主要的这种服务,它还提供了使用PowerShell cmdlet比使用GUI做更多事情的能力!)

也许这个答案晚了五年,但是,如果有人在Windows上执行管理任务或各种东西的一般脚本,他们肯定应该尝试利用PowerShell来达到他们的目的。

这里有很多很棒的答案,这是我的看法。PowerShell是准备好了,如果你是…例子:

grep = "选择string模式"

sort = “sort对象”

uniq = "Get-Unique"

file = "获取项目"

cat = "获取内容"

Perl/AWK/Sed不是命令,而是实用程序,因此很难比较,但在PowerShell中几乎可以做所有事情。