首页 文章

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

提问于
浏览
371

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

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

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

以下是我在PowerShell中寻找的一些具体事项(或等价物):

  • grep

  • 排序

  • uniq

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

  • AWK

  • sed

  • file(提供文件信息的命令)

18 回答

  • 3

    工具只是工具 .
    他们帮助或他们不帮助 .
    你需要帮助,或者你不需要帮助 .

    如果你知道Unix和那些工具做你需要他们在Windows上做的事情 - 那么你是一个快乐的人,没有必要学习PowerShell(除非你想探索) .

    我最初的目的是在Windows中包含一组Unix工具并完成它(团队中的一些人拥有深厚的Unix背景和对该社区的 Health 尊重 . )我发现这不是真的很有帮助 . 原因是awk / grep / sed不能用于COM,WMI,ADSI,注册表,证书存储等等 . 换句话说,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发布后不久,我们将在所有XP及更高版本的平台上提供V2 . 换句话说 - 您的学习投资将适用于大量的机器/环境 .

    最后一条评论 . 如果/当你开始学习PowerShell时,我想你会很高兴 . 很多设计都受到我们的Unix背景的影响很大,所以当我们完全不同的时候,你会非常快速地接受它(在你克服它不是Unix之后:-)) . 我们知道人们的学习预算非常有限 - 这就是为什么我们对一致性的超级核心 . 你将学习一些东西,然后你会一遍又一遍地使用它 .

    实验!请享用!从事!

  • 6

    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 's strength here isn' t它可以对文件系统对象做些什么(它在这里得到完整的信息, dir 适当地返回 FileInfoFolderInfo 对象)是整个提供者模型 .

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


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

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

  • 8

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

    然而,作为一个实用主义者,我不再相信PowerShell是一个很好的答案 . 虽然它是一个出色的Windows工具,并且为填补Window命令行的历史漏洞提供了急需的一步,因为我们都看到微软对消费者计算失误的控制,微软似乎越来越有可能将其操作系统保持为对未来的企业很重要 .

    事实上,鉴于我发现我的工作越来越多地处于异构环境中,我发现目前使用Bash脚本更有用,因为它们不仅可以在Linux,Solaris和Mac OS X上运行,而且还可以使用Cygwin-on Windows的帮助 .

    因此,如果您认为操作系统的未来是商品化的而不是垄断的,那么选择敏捷的开发工具策略似乎是有意义的,这种策略在可行的情况下远离专有工具 . 但是,如果你看到你的未来被所有那个Redmond所主宰,那么就选择PowerShell .

  • -1

    我使用了一些PowerShell来实现脚本自动化 . 虽然很好的环境似乎比Unix shell更经常考虑,但实际上使用对象而不是文本流更加笨重,并且在过去30年中开发了许多Unix工具 . 年仍然缺失 .

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

  • 761

    这里有很多很棒的答案,这是我的看法 . 如果你是的话,PowerShell已准备就绪......示例:

    grep =“Select-String -Pattern

    sort = "Sort-Object"

    uniq =“Get-Unique

    file =“Get-Item

    cat =“Get-Content

    Perl / AWK / Sed不是命令,但实用程序因此很难比较,但您可以在PowerShell中执行几乎所有操作 .

  • 1

    我最近才开始涉足任何严肃程度的PowerShell . 虽然在过去的七年里我一直在几乎完全基于Windows的环境中工作,但我来自Unix背景,发现自己不断尝试“Unix-fy”我在Windows上的交互体验 . 至少可以说是令人沮丧的 .

    将PowerShell与Bashtcshzsh之类的东西进行比较是公平的,因为像 grepsedawkfind 等实用程序严格来说不是shell的一部分;但是,它们始终是任何Unix环境的一部分 . 也就是说,像Select-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体验针对触摸打字员进行了优化;一个人可以在不离开"home"位置的情况下完成所有工作 . 例如,在 Bash 中,使用 Emacs 键绑定(是的,Bash也支持 vi 绑定),使用Ctrl-P和Ctrl-N循环历史记录,同时使用Ctrl-移动到行的开头和结尾分别是A和Ctrl-E ......它肯定没有麻烦 .

    • 简单的事情,如Unix上的多功能分页(la less)也存在 . 当然,人们总是可以下载填补这些空白的第三方工具,但如果这些东西只是_几乎没有任何版本的Unix,那肯定会很好 .

    • 至少在系统API方面,Windows文化主要由支持框架驱动,即 COM.NET ,它们都是高度结构化的和基于对象的 . 另一方面,Unix API的访问传统上是通过文件接口( /dev/proc )或(非面向对象的)C风格的库调用 . 因此脚本体验与其各自的OS范例相匹配也就不足为奇了 . PowerShell本质上是结构化的(一切都是对象)和基于文件的 Bash 和朋友 . PowerShell程序员可以使用的结构化API非常庞大(基本上与现有的标准COM和.NET接口集合相当) .

    简而言之,虽然PowerShell的脚本功能可以说比_1762629更强大(特别是当您考虑.NET BCL的可用性时),但是交互式体验明显变弱,特别是如果您是从完全由键盘驱动的,基于控制台的视角(尽可能多的Unix头) .

  • 116

    无论如何,我不是一个非常有经验的PowerShell用户,但是我接触过的一点点让我印象深刻 . 您可以将内置cmdlet链接在一起,以完成您在Unix提示符下可以执行的任何操作,并且's some additional goodness for doing things like exporting to CSV, HTML tables, and for more in-depth sys-admin types of jobs. And if you really needed something like sed, there'总是UnixUtilsGnuWin32,您可以非常轻松地与Powershell集成 .

    作为一个长期的Unix用户,我在使用命令命名方案时遇到了一些麻烦,如果我知道更多的.NET,我肯定会从中受益更多 .

    所以基本上,我说如果它的Windows唯一性不会造成问题,那么值得学习它 .

  • 56

    如果你喜欢shell脚本,你会喜欢PowerShell!

    A guided tour of the Microsoft Command Shell(Ars Technica)开始 .

  • 32

    将PowerShell与Cygwin / Perl / Shell组合进行比较时,请注意PowerShell仅代表“Shell”部分那个组合 .

    但是,您可以像从cmd.exe或Cygwin那样从PowerShell调用任何命令 . 它没有重新实现指定的函数,它肯定无法与Perl相媲美 .

    它只是一个shell,但它使编程更容易,为.Net世界提供了一个舒适的界面 .

    另请注意,PowerShell需要WinXP,Srv2003或更高版本,这可能会出现问题,具体取决于您的IT基础架构 .

    更新:

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

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

    PowerShell是一个shell,因为它在内置命令,命令行开关,用户函数和外部命令(.exe,.bat,.cmd)之间没有语法差别 . 仅通过在调用中添加命名空间或对象来调用.Net方法 .

    它的可编程性源自.Net框架,而不是来自PowerShell“语言”的任何特定内容 .

    我说我认为,只要将Bugzilla或MediaWiki实现为在Web服务器上运行的PowerShell脚本,PowerShell就是一种“脚本语言”;)

    在此之前,享受comparisons .

  • 14

    由于我最近的实验让我深入了解PowerShell和.NET调用,我必须说PowerShell can 取代Cygwin和Unix shell .

    我不确定Perl,但由于PowerShell和Perl都是图灵完整的编程语言,我将此作为替换Perl的答案 .

    PowerShell在Cygwin和* nix下的普通Bash之上的一件事是它能够执行沙盒DLL调用,通过直接API调用,WMI方法甚至COM对象操作操作系统 . 如何通过代码启动Internet Explorer,然后使用其显示的文档执行任何操作,有效地模拟Web服务器的后端?

    如何从SQL服务器和其他数据提供程序收集数据,解析它们并导出为CSV,邮件消息,文本以及实际上任何类型的现有和不存在的文件格式? (当然,有正确的技能可以从收到的数据中创建有效的文件,但CSV很容易获得) .

    通过签名的cmdlet和脚本,组策略和执行策略,可以提供额外的安全性,即使您以管理员身份运行它们,也可以帮助防止恶意代码在您的系统上运行 .

    关于实现了什么命令 - 理查德的答案列出了它们和PowerShell已经模拟其功能的能力 .

    关于PowerShell是否强大以保证切换 - 这更多是个人偏好的问题,尽管越来越多的Windows服务提供PowerShell cmdlet来控制它们,但不使用PowerShell,这些服务存在被认为是一个障碍 . (Hyper-V服务器是主要的此类服务,它还提供了使用PowerShell cmdlet而不是GUI执行更多操作的功能!)

    可能这个答案已经晚了五年,但是,如果有人在Windows上执行管理任务或各种内容的一般脚本,他们肯定会尝试利用PowerShell来达到他们的目的 .

  • 13

    TL; DR - 我不会在Windows或PowerShell上做任何事情 .


    我个人仍然觉得PowerShell充其量只是给人留下深刻印象 .

    • 选项卡目录路径的完成不会复合,要求用户在每个名称完成后输入路径分隔符 .

    • 我仍然觉得windows甚至没有路径的概念或路径是什么,没有可访问的用户主页指示器 ~/ 缺少一些 @environment://somejibberish/%user_home%

    • NTFS仍然是一团糟,看似永远都是,好运导航 .

    • cmd-esque界面,在PowerShell中仍然可以看到恐龙cmd.exe, edit->mark 仍然是复制信息和仅以可见终端空间的矩形块形式复制的唯一方法 . 和 edit->paste 仍然是将字符串粘贴到终端的唯一方法 .

    • 将它涂成蓝色并不会使它更具吸引力 . 我不介意MS开发人员有颜色的味道 .

    • 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接口,复制和粘贴一个东西(选择复制(鼠标),转换为粘贴,如何现代......) . 但是, git push 之类的东西在Mintty中被打破了 .

    我不是故意咆哮,但我仍然看到Windows上的命令行可用性存在巨大问题,即使是像Cygwin这样的工具 .


    P.S . :只是因为可以在PowerShell中完成某些事情,并不能使它可用 . 可用性比能力更深,而且在我尝试将产品用作消费者时,我倾向于关注它 .

  • 7

    PowerShell中的cmdlet非常好,工作可靠 . 他们的面向对象很吸引我,因为我完全没有完整的设置 . 因为's object oriented, it'错过了很多POSIX工具集的成熟度( awksed ,仅举几例) .

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

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

    GnuWin32安装说明

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

  • 6

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

    对于你的困境,你可能会更好地使用其他人可能落后的脚本语言,像你提到的Perl,或其他像Ruby或Python .

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

  • 3

    为什么不同时使用?在Cygwin中调用PowerShell脚本就像任何其他解释脚本一样,如Perl等 .

    我这么做了,我写了https://bitbucket.org/jbianchi/powershell for Bash包装器来调用Cygwin中的powershell.exe . 它可以用作shebang作为powershell.exe .ps1脚本的第一行(因为PowerShell也使用"#"作为注释) . 有关示例,请参见https://bitbucket.org/jbianchi/powershell/wiki/Home

  • 2

    PowerShell非常强大,比Unix shell的标准内置函数更强大(但仅仅因为它包含了通常用于子程序的大部分功能) . 另外,考虑一下你可以用任何.NET语言编写applet,包括IronPython,IronRuby,PerlNet等 . 或者你可以简单地从PowerShell调用你的cygwin命令,忽略所有额外的功能,它将类似于bash,korn,要么随你...

  • 2

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

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

    它很棒 .

  • 1

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

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

    似乎许多功能都要求您查询Windows管理界面并发出类似SQL的命令以获取所需的信息 .

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

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

    经过几个小时的讨论 Scripting.FileSystemObjectWScript.Shell 并发出"SELECT * FROM Win32_ShortcutFile WHERE Drive = '"&drive&"' AND Path = '"&searchFolder&"'",我终于放弃并解决了Windows资源管理器的 Search 命令,并手动完成 . 在那里看到任何明显的东西,MSDN网站上的所有例子都是如此微不足道,以至于毫无 Value .

    编辑嘿,当然,一旦我写了这篇文章,我就捅了一些,发现了我一直缺少的东西:remove-item命令的 -recurse 选项有问题(如果使用 get-help remove-item -detailed 则显示) .

    我一直在尝试“remove-item -filter'* .xyz'-recurse”并且它无法正常工作,所以我放弃了它 .

    事实证明你需要使用 get-childitem -filter '*.xyz' -recurse | remove-item

  • -1

    您还可以尝试在https://github.com/skanga/BashWin上使用BashWin在Windows上运行Bash脚本 .

相关问题