PowerShell是否准备好在Windows上replace我的Cygwin shell?

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

PowerShell的好处在于,没有Cygwin的队友可以更轻松地使用脚本; 然而,我不知道我是否真的在写这么多的通用脚本,或者甚至人们会使用它们。

Unix脚本function非常强大,PowerShell能够保证切换吗?

以下是我将在PowerShell中查找的一些特定事物(或等价物):

  • grep的
  • 分类
  • uniq的
  • Perl(PowerShell与Perl的function有多近?)
  • AWK
  • SED
  • 文件(提供文件信息的命令)
  • 等等

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

如果你了解Unix,那些工具可以在Windows上完成你所需要的工作 – 那么你是一个快乐的人,不需要学习PowerShell(除非你想探索)。

我最初的意图是在Windows中包含一套Unix工具,并用它来完成(团队中的许多人都具有深厚的Unix背景,并且尊重该社区。)我发现的是,这没有真的帮助很大。 原因是awk / grep / sed不能对付COM,WMI,ADSI,registry,证书库等等。换句话说,UNIX是围绕文本文件自我调整的整个生态系统。 因此,文本处理工具是有效的pipe理工具。 Windows是一个完全不同的生态系统,围绕API和对象进行自我调整。 这就是我们发明PowerShell的原因。

我想你会发现,在很多情况下,当文本处理不能在Windows上得到你想要的。 在这一点上,你会想拿起PowerShell。 注 – 这不是一个全部或没有处理。 在PowerShell中,你可以调用你的Unix工具(并使用他们的文本处理或者PowerShell的文本处理)。 你也可以从你的Unix工具调用PowerShell并获取文本。

再次 – 这里没有宗教 – 我们的重点是给你的工具,你需要成功。 这就是为什么我们如此热衷于反馈。 让我们知道我们在工作中所处的位置,或者您没有所需工具的地方,然后放在清单上并加以解决。 老实说,我们正在挖掘一个30年的洞,所以需要一段时间。 也就是说,如果你拿起Windows Server 2008 R2的testing版和/或我们服务器产品的testing版,我想你会惊讶于这个漏洞有多快被填满。

在使用方面 – 迄今为止我们已经有超过350万的下载量。 这不包括在Windows Server 2008中使用它的人,因为它作为一个可选组件包含在内,不需要下载。 V2将在所有版本的Windows中发布。 除了服务器核心版本之外的所有版本,它都是默认的,它是一个可选的组件。 在Windows 7 / Windows Server 2008 R2发布后不久,我们将在所有平台XP和更高版本上提供V2。 换句话说,您的学习投资将适用于大量的机器/环境。

最后一个评论。 如果/当你开始学习PowerShell时,我想你会很开心的。 大部分的devise都受到我们的Unix背景的严重影响,所以当我们完全不同时,你会很快地捡起它(在你过度诅咒它不是Unix之后:-))。 我们知道人们对学习的预算非常有限 – 这就是为什么我们对于一致性的超级核心。 你会学到一些东西,然后你会反复使用它。

实验! 请享用! 从事!

grep的

Select-String cmdlet和-match运算符使用正则expression式。 你也可以直接利用.NET的regex支持更高级的function。

分类

Sort-Object更强大(比我记得* nix的sort )。 允许对任意expression式进行多级sorting。 在这里,PSH的底层types的维护有助于; 例如, DateTime属性将被sorting为DateTime而不必确保格式化为可sorting的格式。

uniq的

Select-Object -Unique

Perl(PowerShell与Perlfunction有多近?)

就Perl的领域特定支持库的广度而言:无处不在(尚未)。

对于一般的编程,PSH肯定是更加内聚和一致的,并且更容易扩展。 文本消除的一个缺口是相当于perl的..操作符。

AWK

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

SED

[往上看]

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

PSH在这里的优势并不在于它能够处理文件系统对象(它在这里获得完整的信息, dir返回FileInfoFolderInfo对象)就是整个提供者模型。

您可以将registry,证书存储,SQL Server,IE的RSScaching等视为可以通过与文件系统相同的cmdlet进行导航的对象空间。


PSH绝对是Windows上的前进方向。 MS已经使其成为未来非家用产品的一部分要求。 因此,在Exchange中支持SQL Server的丰富支持,这只会扩展。

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

作为一个从事Windows企业开发工作的人,从1997年到2010年,Powershell有了上述的所有好的理由(例如,MS是企业战略的一部分,它与Windows / COM / .NET很好地集成在一起,对象而不是文件提供了“更丰富”的编码模型)。 出于这个原因,我在过去两年左右一直在使用和推广Powershell,并且明确地相信我遵循了“比尔之语”。

然而,作为一个实用主义者,我不再确定Powershell是一个很好的答案。 虽然它是一个出色的Windows工具,并且为填补Window命令行中的历史遗留问题提供了一个非常需要的步骤,因为我们都在观察MS如何控制消费者的计算漏洞,MS似乎越来越有可能在保留OS对未来的企业来说是重要的。

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

因此,如果您认为操作系统的未来是商品化的而不是垄断的话,那么select敏捷的开发工具战略,在可行的情况下远离专有工具似乎是有意义的。 但是,如果你看到你的未来被所有那是雷德蒙德统治,那么去Powershell。

我已经使用了一些PowerShell进行脚本自动化。 虽然这个环境似乎被认为比Unix的shell要好得多,但是在实践中,使用对象而不是文本stream是非常笨拙的,而且在过去30年中开发的许多Unix设施几年仍然失踪。

Cygwin仍然是Windows主机首选的脚本环境。 它确实在完成任务方面胜过了select。

我只是最近才开始在PS里涉足任何程度的严肃性。 虽然在过去的七年中,我几乎完全是在基于Windows的环境中工作,但是我来自Unix背景,发现自己经常试图在Windows上“unix-fy”我的交互体验。 至less可以说是令人沮丧的。

PS与Bash , tcsh或zsh等东西进行比较是公平的,因为像grepsedawkfind等实用程序严格来说不是shell的一部分; 他们将永远是任何Unix环境的一部分。 也就是说,像Select-String这样的PS命令与grep有着非常相似的function,并且作为PS中的一个核心模块捆绑在一起…所以线条可能会有些模糊。

我认为关键是文化 ,各自的工具集将体现各自的文化:

  • Unix是一种基于文件的 (一般来说,非Unicode) 基于文本的文化。 configuration文件几乎都是文本文件。 另一方面,Windows在configuration格式方面一直比较结构化 – configuration通常保存在专用数据库(如Windowsregistry)中,这些数据库需要专门的pipe理工具。
  • Unixpipe理(多年来,开发)接口传统上是命令行和虚拟terminal。 Windows作为一个GUI开始,而pipe理function最近才开始脱离专门的 GUI。 我们可以预期命令行上的Unix经验将会更丰富,更成熟,因为它在PS上占有重要地位,而且我的经验与此相匹配。 就此而言,以我的经验:

    • Unixpipe理经验的目的是让事情在最less的击键中轻松完成。 这可能是由于必须通过缓慢的9600波特率拨号连接来pipe理服务器的历史情况的结果。 现在, PS确实有一些别名,这些别名在很长一段时间内可以避开比较冗长的Verb-Noun标准,但是了解这些别名有点痛苦(任何人都知道比以下更好的东西: alias | where {$_.ResolvedCommandName -eq "<command>"} ?)。

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

      iptables命令往往是冗长的,重复它们的细微差别将是一个痛苦,如果它不是许多纯粹的历史操纵内置function之一,所以插入一个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

      意思是“执行前面的命令,但用51代替-1-50

    • Unix体验针对触摸打字员进行了优化; 一个人几乎可以做任何事情,而不用离开“家”的位置。 例如,在Bash中 ,使用Emacs密钥绑定(是的,Bash也支持vi绑定),使用Ctrl-PCtrl-N完成历史logging的循环,同时移动到行的开始和结束使用Ctrl- ACtrl-E分别…它绝对不会在那里结束。 尝试在PS控制台中进行最简单的导航,而无需从原始位置移开,并且遇到麻烦。

    • Unix上的多function分页(ala less )等简单的东西在PS中似乎并不可用,这有些令人沮丧,而且丰富的编辑器体验也不存在。 当然,我们总是可以下载第三方工具来填补这些空白,但是如果这些东西只是“在那里”,就好像它们具有Unix的味道一样。
  • 至less在系统API方面,Windows文化主要由支持框架(即COM.NET)驱动 ,两者都是高度结构化和基于对象的。 另一方面,访问Unix API通常是通过文件接口( /dev/proc )或(非面向对象的)C风格的库调用。 那么脚本体验与他们各自的操作系统范例相匹配就不足为奇了。 PS本质上是结构化的(一切都是对象),而Bash和Friends是基于文件的。 PS程序员可以使用的结构化API非常广泛(基本上与现有的标准COM和.NET接口集合相当)。

简而言之,虽然PS的脚本function可以说比Bash更强大(尤其是当您考虑.NET BCL的可用性时),但交互式体验显着减弱,特别是如果您是从完全由键盘驱动,基于控制台的angular度(尽可能多的Unix主pipe)。

很多伟大的答案,这是我的要求。 PS已经准备好了,如果你是…例子

grep =“ selectstring – 模式 ”

sort = “Sort-Object”

uniq =“ Get-Unique ”

file =“ Get-Item ”

cat =“ Get-Content ”

Perl / Awk / Sed不是命令,但是实用程序很难比较,但是你几乎可以在Powershell中做所有的事情。

我不是一个非常有经验的PowerShell用户,但是我所暴露的一点点让我印象深刻。 您可以将内置cmdlet链接在一起,以完成Unix提示中可以执行的任何操作,还有一些额外的function可用于执行导出到CSV,HTML表格等更深入的系统pipe理员types工作。 如果你真的需要像sed这样的东西,总是有UnixUtils或者GnuWin32 ,你可以很容易地与Powershell集成。

作为一个长期的Unix用户,我习惯了命令命名scheme,但是我确实有点麻烦,如果我知道更多的.NET,我肯定会从中受益更多。

所以从本质上说,如果Windows的唯一性不会造成问题,那么我认为非常值得学习。

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

Microsoft Command Shell (Ars Technica)的导览开始。

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

但是,您可以像从cmd.exe或Cygwin那样从PowerShell调用任何命令。 它不会重新实现指定的function,它当然不能与Perl相提并论。

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

另外请记住,PowerShell需要WinXP,Srv2003或更高版本,这可能会造成问题,这取决于您的IT基础架构。

更新:

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

我在问题的上下文中发布了我的答案:比较PowerShell和Cygwin以及Perl和bash。

PowerShell是一个shell,因为它在内置命令,命令行开关,用户函数和外部命令(.exe,.bat,.cmd)之间没有任何语法上的区别。 通过在调用中添加名称空间或对象,只有调用.Net方法才会有所不同。

其可编程性来自.Net框架,而不是来自PowerShell“语言”特定的任何东西。

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

在此之前,享受比较 。

正如我最近的实验让我深入了解Powershell和.NET的调用,我必须说Powershell 可以取代Cygwin和Unix shell。 我不确定Perl,但是因为Powershell和Perl都是Turing作为编程语言完成的,所以我也把它当作replacePerl的一个好方法。 Powershell在* nix下的Cygwin和普通bash之上的一件事就是它能够执行沙盒DLL调用,通过直接的API调用,WMI方法甚至COM对象操纵操作系统。 如何通过代码启动IE,然后用显示的文档做任何你想要的,有效地模拟一个Web服务器的后端? 如何收集来自SQL服务器和其他数据提供者的数据,parsing它们并导出为CSV,邮件,文本以及实际上任何types的现有和不存在的文件格式? (当然有适当的技能来创build一个有效的文件,当然,但CSV是随时可用)而且有一个额外的安全可用通过签名的cmdlet和脚本,组策略和执行策略,有助于防止恶意代码运行在您的系统,即使您以pipe理员身份运行它们。

关于什么命令被实现 – 理查德的答案列出了他们和Powershell已经能够模仿他们的function。

关于PowerShell是否强大,可以保证切换 – 这更多的是个人喜好,尽pipe随着越来越多的Windows服务提供Powershell cmdlet来控制它们,Powershell不会使用这些服务,这被认为是一个障碍。 (Hyper-V服务器是主要的这种服务,它还提供了使用Powershell cmdlet比使用GUI更多的function!)

可能这个答案迟了五年,但是如果有人在Windows上执行pipe理任务或者一般的脚本,他们肯定会尝试利用Powershell来达到目的。

TL; DR – 我不讨厌Windows或Powershell我只是不能在Windows或PowerShell中任何事情。


我个人仍然觉得powershell充其量是最好的。

  • 目录path的选项卡完成不复合,需要用户在每个名称完成后inputpath分隔符。
  • 我仍然觉得窗户甚至没有path或path的概念,没有可访问的用户家庭指标~/缺less一些@environment://somejibberish/%user_home%
  • NTFS仍然是一团糟,看起来总是会的,祝你好运导航。

  • cmd-esque界面,恐龙cmd.exe在Powershell中仍然可见, edit->mark仍然是复制信息的唯一方法,只能以可见terminal空间的矩形块的forms进行复制。 edit->paste仍然是将string粘贴到terminal的唯一方法。

  • 把它画成蓝色并不会使它变得更有吸引力。 我不介意MS开发人员尝试色彩。

  • Windows始终在屏幕的左上angular打开,对于使用垂直任务栏的人来说,这是令人难以置信的烦恼,特别是考虑到Windows任务栏将覆盖可访问复制/粘贴function的唯一窗口。

我无法说出太多的工具窗口包括的理由。 因为有一整套开放源代码,免费授权的cli工具,而且据我所知,powershell也没有一个是完全令人失望的。

  • powershell wget带给gnu wget看似无与伦比的参数,感谢一线希望的无用的希望。
  • powershell posix不是bash兼容的,特别是&&操作符不被处理,使得最简单的条件命令不是一件事情。

我不知道男人,我给了它一个镜头,我真的做到了; 我仍然试图在下次打开它的时候给它一个希望,那将是没用的。 我不能在PowerShell中做任何事情,我可以忍受做一个真正的项目,把GNU工具带到Windows上。

MySysGit为我提供了dinosur cmd.exe提示符和一些gnu工具,但仍然非常令人沮丧,但最后的path完成工作。 而git命令将在gitBash中运行

Mintty for MySysGit通过mysysgit的环境提供Cygwin接口,进行复制和粘贴。 (select复制(鼠标), 移动 +粘贴,如何现代…)但是,像git push东西在Mintty中被打破。

我并不是要咆哮,但是即使有像Cygwin这样的工具,我仍然在Windows上看到命令行可用性方面的巨大问题。


PS只是在PowerShell中做一些事情,不能使它变得可用 ,可用性比能力更深,而且当我试图用产品作为消费者的时候,我倾向于关注它。

在powershell中的cmdlet是非常好的,可靠地工作。 因为我是一个java / C#开发人员,所以他们的面向对象性吸引了我很多,但它并不是一个完整的集合。 由于它是面向对象的,所以错过了很多POSIX工具集( awksed等等)的文本stream成熟度。

我发现,爱好面向对象技术和在POSIX工具中成熟的困境,最好的答案就是使用两者! Powershell的一个重要方面就是它可以很好地将对象传送给标准stream。 Powershell默认使用对象pipe道来传输对象。 这些不是标准stream(标准输出,标准错误和标准input)。 当Powershell需要将输出传递给没有对象stream水线的标准stream程时,它首先将对象转换为文本stream。 既然它做得这么好,Powershell就成为了一个很好的托pipePOSIX工具的地方!

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

GnuWin32安装说明

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

我还没有看到Powershell真的起飞了,至less现在还没有。 所以,除非你的团队中的其他人已经知道,否则不值得去学习。

为了你的困境,你可能会用其他人可能得到的脚本语言,像你提到的Perl,或者像Ruby或Python这样的其他语言。

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

为什么不使用两个? 在Cygwin中调用PowerShell脚本就像任何其他解释的脚本,如Perl等

我这样做,我写了一个bash包装https://bitbucket.org/jbianchi/powershell来调用Cygwin中的powershell.exe。; 可以用作Shebang作为powershell.exe .ps1脚本的第一行(因为powershell也使用“#”作为注释)。 有关示例,请参阅https://bitbucket.org/jbianchi/powershell/wiki/Home

PowerShellfunction非常强大,比Unix shell的标准内置function更强大(但仅仅是因为它包含了许多通常用于子程序的function)。 另外,考虑到你可以使用任何.NET语言编写applet,包括IronPython,IronRuby,PerlNet等。或者你可以直接从PowerShell中调用你的cygwin命令,忽略所有额外的function,它的工作原理和bash,korn,pipe他呢…

In a couple of lines, Cygwin and Powershell are different tools however if you have Cygwin installed you can run the Cygwin executables within a Powershell session. I've gotten so used to Powershell that now I no longer use grep, sort, awk, etc. There are pretty much built-in alternatives in Powershell, and if not you can find a cmdlet out there.

The main tool I find myself using is ssh.exe but within a Powershell session.

很好用。

You can also try running Bash scripts on windows using BashWin at https://github.com/skanga/BashWin

I found PowerShell programming to be not worth the effort.

I have several years of experience with shell scripting under Unix, but I found it enormously difficult to do much of anything with PowerShell.

It seems like many functions require you to interrogate the Windows Management Interface and issue SQL-like commands to get the information you need.

For example, I wanted to write a script to remove all files with a specific suffix from a directory tree. Under Unix, this would be a simple …

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

After a couple of hours dicking around with Scripting.FileSystemObject and WScript.Shell and issuing "SELECT * FROM Win32_ShortcutFile WHERE Drive = '" & drive & "' AND Path = '" & searchFolder & "'", I finally gave up and settled for Windows Explorer's Search command and just do it manually. There's probably some way to do what I wanted, but I didn't see anything obvious and all the examples on the MSDN site were so trivial as to be worthless.

EDIT Heh, of course as soon as I wrote this I poked around some more and found what I had been missing: the -recurse option to the remove-item command is faulty (revealed if you use get-help remove-item -detailed ).

I had been trying "remove-item -filter '* .xyz' -recurse" and it wasn't working, so I gave up on it.

Turns out you need to use get-childitem -filter '*.xyz' -recurse | remove-item