关于unix:PowerShell是否已准备好在Windows上替换我的Cygwin shell?

Is PowerShell ready to replace my Cygwin shell on Windows?

我正在讨论我应该学习PowerShell,还是只使用cygwin/perl脚本/unix shell脚本等。

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

Unix脚本是如此强大,PowerShell是否足够接近以保证切换?

以下是我将在PowerShell中查找的一些特定内容(或等效内容):

  • 格雷普
  • 分类
  • UNIQ
  • Perl(PowerShell与Perl的功能有多接近?)
  • AWK
  • 塞德
  • 文件(提供文件信息的命令)
  • 等。


工具只是工具。他们帮忙,否则就不帮忙。你需要帮助还是不需要。

如果您知道Unix和这些工具在Windows上做您需要它们做的事情,那么您是一个快乐的人,不需要学习PowerShell(除非您想探索)。

我最初的目的是在Windows中包含一组Unix工具,并用它来完成(团队中的很多人都有深厚的Unix背景和对社区的良好尊重。)我发现这并没有起到多大的作用。原因是awk/grep/sed不适用于com、wmi、adsi、注册表、cert store等。换句话说,unix是一个完整的生态系统,可以根据文本文件进行自我调优。因此,文本处理工具是有效的管理工具。Windows是一个完全不同的生态系统,围绕API和对象进行自我调优。这就是我们发明PowerShell的原因。

我想你会发现,在很多情况下,文本处理无法满足你在Windows上的需求。此时,您将需要使用PowerShell。注意-这不是一个完全或完全的交易。在PowerShell中,您可以调用Unix工具(并使用它们的文本处理或PowerShell的文本处理)。您还可以从UNIX工具调用PowerShell并获取文本。

再说一遍——这里没有宗教信仰——我们的重点是为你提供成功所需的工具。这就是为什么我们如此热衷于反馈。让我们知道我们在工作中遇到了什么困难,或者你没有你需要的工具,我们会把它列在清单上,然后开始做。老实说,我们正在挖一个30年的坑,所以要花一段时间。也就是说,如果你选择WindowsServer2008/R2的测试版和/或我们的服务器产品的测试版,我想你会对这个漏洞被填补的速度感到震惊。

关于使用情况,我们迄今为止下载量超过350万次。这不包括WindowsServer2008中使用它的人,因为它是作为可选组件包含的,不需要下载。V2将在所有版本的Windows中发布。默认情况下,除了作为可选组件的服务器核心外,所有版本都将启用它。Windows7/WindowsServer2008 R2发布后不久,我们将在所有平台XP及更高版本上提供V2。换句话说,你在学习上的投资将适用于大量的机器/环境。

最后一条评论。如果你开始学习PowerShell,我想你会很高兴的。大部分设计都受到我们的Unix背景的严重影响,因此,尽管我们有很大的不同,但您将很快地了解到它(在您克服了对它不是Unix的指责之后):-)。我们知道人们在学习上的预算非常有限——这就是为什么我们在一致性方面是超级核心的原因。你会学到一些东西,然后你会一次又一次地使用它。

实验!享受!订婚!


grep

Select-StringCmdlet和-match运算符使用regex。此外,您还可以直接利用.NET对regex的支持来实现更高级的功能。

sort

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

uniq

Select-Object -Unique

Perl (how close does PowerShell come to Perl capabilities?)

就Perl对特定于域的支持库的广度而言:还没有关闭的地方。

对于一般编程来说,PowerShell肯定更具凝聚力和一致性,并且更易于扩展。文本挖掘的一个缺口相当于Perl的..操作符。

AWK

自从使用awk以来已经足够长了(必须大于18年,因为后来我才使用perl),所以不能真正发表评论。

sed

[见上文]

file (the command that gives file information)

PowerShell在这里的优势不在于它可以对文件系统对象做什么(它在这里得到完整的信息,dir返回FileInfoFolderInfo对象,这是整个提供程序模型)。

您可以将注册表、证书存储区、SQL Server、Internet Explorer的RSS缓存等视为可由与文件系统相同的Cmdlet导航的对象空间。

在Windows上,PowerShell绝对是前进的一步。微软已经将其作为未来非家用产品需求的一部分。因此,在Exchange中支持丰富,在SQL Server中支持丰富。这只会扩大。

最近的一个例子是TFS PowerToys。许多TFS客户机操作在每次都不必启动tf.exe(这需要一个新的TFS服务器连接等)的情况下完成,并且在进一步处理数据时特别容易。以及允许对整个TFS客户机API进行更详细的访问,而不是在tf.exe的任一团队资源管理器中公开。


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

然而,作为一个实用主义者,我不再确定PowerShell是否是一个很好的答案。虽然它是一个优秀的Windows工具,为填补Windows命令行这一历史性漏洞提供了非常必要的一步,正如我们都看到的,微软在消费者计算上的失利,似乎越来越有可能,微软将其操作系统作为未来企业的重要组成部分,面临着一场巨大的战斗。

事实上,由于我发现我的工作越来越多地在异构环境中进行,我发现现在使用bash脚本更有用,因为它们不仅可以在Linux、Solaris和Mac OS X上工作,而且还可以在Windows上使用cygwin。

因此,如果你相信操作系统的未来是商品化的,而不是垄断的,那么选择一种敏捷开发工具策略似乎是有意义的,它在可行的情况下远离专有工具。然而,如果你看到你的未来被雷蒙德所控制,那就去买PowerShell吧。


我使用了一些PowerShell来实现脚本自动化。虽然环境似乎比Unix shell被考虑的要多得多,但实际上,使用对象而不是文本流更为繁琐,而且在过去30年中开发的许多Unix设施仍然缺失。

Cygwin仍然是我为Windows主机选择的脚本环境。在完成任务方面,它当然比其他选择要好。


这里有很多很好的答案,这是我的答案。PowerShell已就绪,如果您…实例:

grep="选择字符串-模式"

sort="排序对象"

uniq="独一无二"

file="获取项目"

cat="获取内容"

perl/awk/sed不是命令,但实用程序因此很难比较,但您几乎可以在PowerShell中执行所有操作。


我最近才开始认真地涉足PowerShell。尽管在过去的七年里,我在一个几乎完全基于Windows的环境中工作,但我来自于一个Unix背景,我发现自己一直在努力"unix fy"我在Windows上的交互体验。说得最少一点让人沮丧。好的。

将PowerShell与bash、tcsh或zsh之类的工具进行比较是公平的,因为grep、sed、awk、find等工具严格来说不是shell的一部分;但是,它们始终是任何UNIX环境的一部分。也就是说,像select string这样的powershell命令具有与grep非常相似的功能,并且在powershell中捆绑为核心模块…所以线条可能有点模糊。好的。

我认为最关键的是文化,事实上,各自的工具集将体现各自的文化:好的。

  • Unix是一种基于文件的(通常是非Unicode)基于文本的区域性。配置文件几乎都是纯文本文件。另一方面,Windows在配置格式方面的结构一直都要高得多——配置通常保存在专有数据库(例如,Windows注册表)中,这些数据库需要专门的工具来进行管理。
  • Unix管理(以及多年来的开发)界面传统上是命令行和虚拟终端。Windows从一个图形用户界面开始起步,而管理功能最近才开始从完全基于图形用户界面的转变。我们可以期望在命令行上的Unix体验更丰富、更成熟,因为它在PowerShell上具有重要的领先地位,而且我的经验与此相匹配。根据我的经验:好的。

    • Unix管理经验的目的是使操作简单,只需最少的按键;这可能是由于历史上必须通过9600波特的缓慢拨号连接来管理服务器造成的。现在,PowerShell确实有别名,这对绕过相当冗长的动词名词标准有很大帮助,但是了解这些别名有点痛苦(有人知道比:alias | where {$_.ResolvedCommandName -eq""}更好的东西吗?).好的。

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

      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 pakbd和ctrl nakbd完成历史循环,同时使用ctrl actrl e分别完成行首和行尾的移动…但它肯定不会就此结束。即使在PowerShell控制台中尝试最简单的导航,但不要从起始位置移动,否则会遇到麻烦。好的。

    • Unix上的通用分页(无LA)等简单功能在PowerShell中似乎没有现成的功能,这有点令人沮丧,而且丰富的编辑器经验也不存在。当然,人们可以随时下载第三方工具来填补这些空白,但是如果这些工具只是"存在"的话,就像它们在任何风格的Unix上一样,那就太好了。
  • 至少在系统API方面,Windows文化主要由支持框架(即COM和.NET)驱动,这两个框架都是高度结构化和基于对象的。另一方面,对Unix API的访问传统上是通过文件接口(/dev/proc或(非面向对象的)C样式库调用进行的。因此,脚本体验与它们各自的操作系统范例相匹配也就不足为奇了。PowerShell本质上是结构化的(所有内容都是一个对象),它基于bash和friends文件。由PowerShell程序员使用的结构化API非常庞大(基本上与现有标准COM和.NET接口集的庞大程度相匹配)。好的。

简言之,尽管PowerShell的脚本功能比bash(尤其是考虑到.NET BCL的可用性)更强大,但交互体验却明显较弱,特别是从完全由键盘驱动、基于控制台的角度(就像许多Unix头一样)来看的话。好的。好啊。


无论如何,我不是一个非常有经验的PowerShell用户,但是我接触到的那一点给我留下了深刻的印象。您可以将内置的Cmdlet链接在一起,以便在Unix提示下执行任何操作,而且还可以执行一些其他操作,例如导出到csv、html表,以及执行更深入的sys admin类型的作业。如果您真的需要类似于sed的东西,那么总是有unixutils或gnuwin32,您可以很容易地将其与PowerShell集成。

但是,作为一个长期使用Unix的用户,我很难适应命令命名方案,如果我了解更多的.NET,我肯定会从中受益更多。

所以从本质上说,如果它的窗口的唯一性不构成问题的话,我认为它是值得学习的。


最近的实验让我深入了解了PowerShell和.NET调用的深度,我必须说PowerShell可以取代Cygwin和UnixShell。

我不确定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来实现他们的目的。


如果你喜欢shell脚本,你会喜欢powershell的!

从微软命令shell(ars-technica)的指导教程开始。


当您将PowerShell与cygwin/perl/shell组合进行比较时,请注意PowerShell仅代表该组合的"shell"部分。

但是,您可以从PowerShell调用任何命令,就像从cmd.exe或cygwin调用一样。它不会重新实现指定的函数,而且肯定无法与Perl进行比较。

它"只是"一个外壳,但它使编程更容易,为.NET世界提供了一个舒适的界面。

还要记住,PowerShell需要winxp、srv2003或更高版本,这可能会造成问题,具体取决于您的IT基础架构。

更新:

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

我在问题的上下文中发布了我的答案:将PowerShell与Cygwin、Perl和Bash进行比较。

PowerShell是一个shell,因为它在内置命令、commandlets、用户函数和外部命令(.exe,.bat,.cmd)之间没有语法差异。只有调用.NET方法不同于在调用中添加命名空间或对象。

它的可编程性源于.NET框架,而不是特定于PowerShell"语言"的任何内容。

我认为,只要Bugzilla或Mediawiki作为PowerShell脚本在Web服务器上运行,PowerShell就是一种"脚本语言";)

在此之前,请欣赏这些比较。


tl;dr——我不讨厌Windows或PowerShell,我只是不能在Windows或PowerShell上做任何事情。

我个人认为,PowerShell充其量也没什么吸引力。

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

  • Cmd-esque接口,恐龙Cmd.exe在PowerShell中仍然可见,edit->mark仍然是复制信息的唯一方式,并且只能以矩形块的可见终端空间进行复制。而edit->paste仍然是将字符串粘贴到终端的唯一方法。

  • 把它涂成蓝色不会使它更吸引人。不过,我不介意微软开发人员对颜色有兴趣。

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

我不能说太多,因为窗户里有工具。据我所知,有一整套开放源码、免费许可的cli工具和PowerShell附带,它们都不是一种彻底的失望。

  • PowerShell wget对GNUwget采用了看似无法比拟的论据,这要感谢希望的微光,因为希望是可携式的无用的。
  • PowerShell POSIX与bash不兼容,特别是不处理&&运算符,使得最简单的条件命令后面没有任何内容。

我不认识男人,我试过了,我真的试过了,我还是试着试着试一下,希望下次我打开它的时候,它就没什么用了。我不能在PowerShell中做任何事情,而且我几乎不能用真正的项目将GNU工具引入Windows。

mysygit给了我恐龙的cmd.exe提示和几个GNU工具,它仍然是非常令人失望的,但最后路径完成工作。git命令将在git bash中运行。

Mintty for MySysGit在MySysGit的环境中提供了Cygwin接口,使复制和粘贴成为一件事情(选择复制(鼠标),shift+ins要粘贴,多么现代…)。然而,像git push这样的东西在Mintty中被破坏了。

我并不想咆哮,但我仍然看到Windows上的命令行可用性存在巨大的问题,即使给定了类似cygwin的工具。

附言:仅仅因为在PowerShell中可以做一些事情,就不能使它可用。可用性比能力更深刻,当我试图将产品作为消费者使用时,我倾向于关注它。


PowerShell中的Cmdlet非常好,工作可靠。他们的目标取向吸引了我很多,因为我是一个爪哇/ 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脚本,就像其他解释脚本(如perl等)一样。

我做的足够多,以至于我写了https://bitback.org/jbianchi/powershell,让bash包装器在cygwin中调用powershell.exe。它可以用作powershell.exe.ps1脚本的第一行shebang(因为powershell也使用""作为注释)。示例请参见https://bitback.org/jbianchi/powershell/wiki/home


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

对于您的困境,您最好使用其他人可能会落后的脚本语言、您提到的Perl或Ruby或Python等其他语言。

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


在几行中,cygwin和powershell是不同的工具,但是如果安装了cygwin,则可以在powershell会话中运行cygwin可执行文件。我已经习惯了PowerShell,现在我不再使用grep、sort、awk等。PowerShell中有很多内置的备选方案,如果没有,您可以在那里找到一个Cmdlet。

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

它很好用。


PowerShell的功能非常强大,比Unix shell的标准内置程序更强大(但这仅仅是因为它包含了许多通常被解压到子程序中的功能)。另外,考虑您可以用任何.NET语言编写小程序,包括Ironpython、IronRuby、Perlnet等。或者,您可以从PowerShell中简单地调用cygwin命令,忽略所有额外的功能,它将类似于bash、korn或其他任何功能…


您也可以尝试使用bashwin在Windows上运行bash脚本https://github.com/skanga/bashwin.


我发现PowerShell编程不值得这么做。

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

许多函数似乎都要求您询问Windows管理界面并发出类似SQL的命令以获取所需的信息。

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

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

在与Scripting.FileSystemObjectWScript.Shell进行了几个小时的讨论,并发出了"从win32 shortcutfile(其中drive='&drive&;drive&;and path='&searchfolder&;searchfolder&;"')中选择*"后,我最终放弃了Windows资源管理器的搜索命令,只需手动执行即可。也许有办法做我想做的事情,但我没有看到任何明显的东西,而且在msdn网站上的所有例子都是如此的微不足道以至于毫无价值。

编辑heh,当然,当我写这篇文章的时候,我又翻了一番,发现我遗漏了什么:删除项目命令的-recurse选项是错误的(如果使用get-help remove-item -detailed)。

我一直在尝试"删除项目-过滤器"*.xyz'-重复使用",但它不起作用,所以我放弃了它。

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