PowerShell是否准备好在Windows上替换我的Cygwin Shell?[关闭]


384

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

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

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

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

  • grep
  • 分类
  • 优衣库
  • Perl(PowerShell与Perl的功能有多接近?)
  • AWK
  • sed
  • 文件(提供文件信息的命令)
  • 等等

7
我不会这么说,我有兴趣选择Powershell,找到了此页面,现在我知道了PS和我惯用的shell脚本之间的一般差异。
Bender the Greatest'July

5
该帖子突然从HN链接提交中灰飞烟灭。做得好。对于@Bobby来说,关闭此链接不是建设性的也是不利的。
2012年

26
如果有人不能问一个工具复制另一个工具的功能如何,那么SO就无法回答工具比较问题。为避免引起争议,用了谨慎的措词,但只是为了看起来像Unix vs Windows问题而粗心大意地推定为“有争议的”。它得到了一个事实,客观的答案,并且进一步了解了Unix脚本在Windows上可能有多有用。
chernevik

16
为什么又关闭了?有人请编辑标题,说“ Windows平台上的PowerShell vs Unix Shells”,以使巨魔远离将其视为“ Windows vs Unix”,事实并非如此。这是一个极富建设性的问题-投票重开。
x0n

3
操作是将外壳与工具混合。PowerShell有其用途。但是GNU是一个将UNIX好东西免费带到其他操作系统(包括Windows)的项目。op列表中的所有内容在Windows中都有一个gnu实现。可从GnuWin32或单个站点访问。Windows BAT并非没有用,它具有重定向,管道和条件。
MeaCulpa

Answers:


783

工具只是工具。
他们有帮助或没有。
您需要帮助或不需要。

如果您知道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的beta和/或我们的服务器产品的beta,我想您会以为这一漏洞被迅速填补而感到震惊。

关于使用率-迄今为止,我们的下载量已超过350万。这不包括Windows Server 2008中使用它的人员,因为它是作为可选组件提供的,不需要下载。

V2将在所有版本的Windows中提供。对于所有版本,默认情况下它将是默认状态,除了Server core是可选组件之外。Windows 7 / Windows Server 2008 R2发行后不久,我们将在Windows XP及更高版本的所有平台上提供V2。换句话说-您在学习上的投资将适用于非常多的机器/环境。

最后的评论。如果/当您开始学习PowerShell时,我认为您会很高兴。许多设计在很大程度上受我们的Unix背景的影响,因此尽管我们有很大的不同,但是您会很快选择它(在您确定它不是Unix :-)之后)。

我们知道人们的学习预算非常有限-这就是为什么我们对一致性非常坚决。您将学习一些东西,然后将一遍又一遍地使用它。

实验!请享用!从事!


11
感谢您的回答。我想我将继续学习PowerShell。到目前为止,它看起来很强大,而且我将能够在工作中编写更多有用的脚本。
安迪·怀特2009年

55
@Jeffrey:是否有机会为Windows提供更好的终端?Powershell是一种功能强大的脚本语言,但是它在cmd.exe中运行的事实使其在交互模式下更加方便
sumek 2010年

47
这个“非建设性”的问题产生了我对整个“在Unix上一切都是文件”的口号的最佳见解,以及为什么Windows与众不同。也许在不进行建设性讨论的情况下更好地使用StackOverflow ?
chernevik

12
@sumek-试试看ConEmu; 我已经使用了几个星期了,它非常贴心:hanselman.com/blog/…–
EZ Hart

4
注意:powershell不喜欢管道二进制数据。因此,当您在调用可靠的Unix工具时要当心,只是不要像tar -c . | gzip > package.tar.gz 直接在PowerShell中那样做,否则会很痛苦。见brianreiter.org/2010/01/29/...
Interarticle

123

grep

Select-Stringcmdlet和-match运算符可使用正则表达式。您也可以直接使用.NET的正则表达式支持来获得更多高级功能。

分类

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

优衣库

Select-Object -Unique

Perl(PowerShell与Perl功能之间的距离如何?)

就Perl特定领域支持库的广度而言:还远远没有(到目前为止)。

对于常规编程,PowerShell当然具有更强的凝聚力和一致性,并且更易于扩展。文字修饰的一个空白等同于Perl的..运算符。

AWK

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

sed

[往上看]

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

在这里,PowerShell的优势与其对文件系统对象所做的事情无关(它可以在此处获取完整的信息,适当的dir返回FileInfoFolderInfo对象)是整个提供程序模型。

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


PowerShell绝对是Windows上的前进之路。Microsoft已将其作为对未来非家用产品的要求的一部分。因此在Exchange中有丰富的支持,在SQL Server中也有支持。这只会扩大。

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


2
事实是,提供程序模型很有趣,只是因为操作系统不使用文本作为其通用配置介质,因此您需要这些提供程序。使用UNIX,大多数语言都具有用于接触PAM,主机和程序包的API,但是最终文本始终会存在。
Daishiman

12
文本并非始终是所有内容的最佳格式(从数据库和光栅图像开始)。但是我认为我们可以不同意而不是开放格式的战争。
理查德

5
Powershell可以使用.NET框架中的任何对象,这不匹配Perl的域功能吗?另外,如果您想重复使用,可以用C#等编写cmdlet
Chris

逐点比较。好一个。这应该是公认的答案。PowerShell的优势在于.NET的基础,以及通过编写新的Cmdlet甚至调用类库来扩展系统的
难度

sed(我认为)的典型用法是:sed 's/pattern/replacement/' file,大约gc file | %{$_ -replace 'pattern','replacement'}与awk类似:awk 'BEGIN {} /pat1/ {action1} /pat2/ {action2} END {}' file大约{BEGIN {}; switch -r -c -file file { 'pat1' {action1} 'pat2' {action2}}; END{};}
Nathan Chappell

56

作为一个从1997年至2010年专注于Windows企业开发的人,基于先前给出的所有充分理由,显而易见的答案将是PowerShell(例如,它是Microsoft企业战略的一部分;它与Windows / COM / .NET很好地集成;以及使用对象而不是文件提供了“更丰富”的编码模型)。因此,在过去的两年左右的时间里,我一直在使用和推广PowerShell,显然我遵循的是“条例草案”。

但是,作为实用主义者,我不再确定PowerShell是一个很好的答案。尽管它是出色的Windows工具,并且为填补Windows命令行这一历史性漏洞提供了急需的步骤,但是当我们所有人都看到Microsoft掌握了消费者计算能力时,微软似乎仍在为保持其操作系统的地位而进行巨大的战斗对未来的企业很重要。

确实,鉴于我发现自己的工作越来越在异构环境中进行,因此我发现现在使用Bash脚本更为有用,因为它们不仅可以在Linux,Solaris和Mac OS X上运行,而且还可以与Bash脚本一起使用。 Cygwin的帮助-在Windows上。

因此,如果您相信操作系统的未来是商品化的而不是垄断的,那么选择敏捷的开发工具策略似乎是合理的,在可行的情况下,该策略应远离专有工具。但是,如果您看到自己的未来被Redmond主导,那么请使用PowerShell。


1
Unix脚本是否可以在Cygwin-Windows上正常运行而没有错误?
Pacerier,2015年

@Pacerier我使用Cygwin和MinGW已有12年了,遇到问题的机会很少。重要的是,如果某些操作不起作用,则始终可以使用Windows工具或其他任何工具-进程的启动方式可以与其他任何Shell启动它们的方式相同。
Evgeni Sergeev

4
好的,您的答案是从2011年开始的。今天,powershell也在Linux上运行。而且-我个人认为-bash太过古老了。语法太可怕了,我宁愿使用其他脚本语言。如今,在大多数Linux发行版中,Python都是标准配置,我看不出有任何理由在脚本中使用bash。我建议您再次检查powershell,因为自2011
。– itmuckel 16/09/19


33

我使用了一些PowerShell进行脚本自动化。尽管对环境的思考似乎比Unix shell要好得多,但实际上使用对象而不是文本流要笨拙得多,并且在最近30年中开发了许多Unix工具。几年仍然失踪。

Cygwin仍然是Windows主机的首选脚本环境。在完成工作方面,它无疑比其他选择更好。


27
使用对象是一种范式转换,需要一定的习惯。但是避免在涉及结构化数据的每个步骤中进行整体重新解析(例如,无需确保对字段进行定界)。
理查德

16
@Andy White @Daishiman,我可以理解PowerShell的学习曲线,但是管道对象比管道文本要灵活得多。@理查德是正确的。:)
史蒂芬·穆拉夫斯基

18
汽车制造商也很难与1000多年的马匹争论。我不是想变得轻率。仅指出过去的成功并不能消除创新的潜在利益。
EBGreen

12
@daishiman-对象的好处是,当您需要一个属性时,您就可以请求它-不必解析,猜测,广播。对于“对象不具有兼容方法时会发生什么”,我不理解您的观点-您能说另一种方式还是举例说明问题?谢谢。
Jeffrey Snover-MSFT

13
@Daishiman-我明白。在实践中,人们发现这不是问题,而是巨大的优势。就是说,我可以看到,如果您是专家的文本解析器,这将是一种学习的新技能,一开始它可能会感到不必要和尴尬。再次强调-正确的工具是有帮助的。
Jeffrey Snover-MSFT

15

这里有很多很棒的好答案,这是我的看法。如果您愿意,PowerShell已准备就绪...示例:

grep =“ 选择字符串-模式

sort = “排序对象”

uniq =“ Get-Unique

file =“ 获取项目

cat =“ 获取内容

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


2
您是否可以相信我们的祖先被迫使用的秘密的四字母命令?
Evgeni Sergeev

4
@EvgeniSergeev上述所有默认为可用slssortgugigc分别。易读的长名称,用制表符补全,而短的可键入名称在一个系统中。这对您来说是用户友好的进步。
TessellatingHeckler

的别名之一Get-Contentcat,因此对于这一别名,Cygwin / Unix和PowerShell之间没有任何区别。不幸的是,在大多数情况下,Microsoft的cmdlet文档缺少有关别名的信息,但是在PowerShell会话中使用会输出所有别名的列表Get-Alias。“ Get-Unique”的别名是“ gu”,因此比Cygwin / Unix的别名短!
彼得·莫滕森

13

我只是最近才开始认真地尝试一下PowerShell。尽管在过去的七年中,我一直在几乎完全基于Windows的环境中工作,但我来自Unix背景,发现自己一直在努力尝试“ Unix-fy”我在Windows上的交互经验。至少可以说令人沮丧。

将PowerShell与Bashtcshzsh之类的东西进行比较是公平的,因为grepsedawk等工具会找到严格来讲,等不是Shell的一部分。但是,它们将始终是任何Unix环境的一部分。也就是说,像一个PowerShell命令选择字符串有一个非常类似的功能的grep捆绑在PowerShell的核心模块...这样的线可有点模糊。

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

  • Unix是基于文件的,(通常是非Unicode)基于文本的区域性。配置文件几乎是纯文本文件。另一方面,Windows在配置格式方面总是结构更加复杂-配置通常保存在专有数据库(例如Windows注册表)中,而专有数据库需要专门的工具来进行管理。
  • Unix管理界面(以及多年来的开发界面)传统上一直是命令行和虚拟终端。Windows从GUI开始,而管理功能直到最近才开始逐渐消失完全基于GUI的功能。考虑到它在PowerShell上的重要地位,我们可以期望命令行上的Unix经验会更丰富,更成熟,而我的经验与此相匹配。就此,以我的经验:

    • 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

      意思是“执行上一个命令,但-1--2-50替换51

    • Unix体验是为触摸打字员优化的;一个人几乎可以做任何事情而无需离开“家”的位置。例如,在Bash中,使用Emacs键绑定(是的,Bash也支持vi绑定),使用来完成历史记录的循环Ctrl-PCtrl-N而分别使用Ctrl-A和来完成行的开始和结束。Ctrl-E不止于此。尝试在PowerShell控制台中进行最简单的导航,而不必离开原位,这会给您带来麻烦。

    • 诸如Unix上的通用分页(或更少)之类的简单事情似乎在PowerShell中无法立即使用,这有点令人沮丧,并且也不存在丰富的编辑器经验。当然,总是可以下载可以弥补这些空白的第三方工具,但是,如果这些东西只是“存在”,就像它们在几乎任何类型的Unix上一样,那肯定会很好。
  • 至少在系统API方面,Windows文化在很大程度上由支持框架(即COM.NET)驱动,这两种框架都是高度结构化且基于对象的。另一方面,对Unix API的访问传统上是通过文件接口(/dev/proc)或(非面向对象的)C风格的库调用来进行的。因此,脚本编写经验与各自的OS范例相匹配就不足为奇了。PowerShell本质上是结构化的(一切都是对象),并且基于Bash和朋友文件。PowerShell程序员可以使用的结构化API庞大(基本上与现有的标准COM和.NET接口集合的庞大匹配)。

简而言之,尽管可以说PowerShell的脚本功能比Bash强大(特别是当您考虑.NET BCL的可用性时),但交互式体验却明显较弱,特别是如果您是完全由键盘驱动的,基于控制台的观点(与许多Unix头一样)。


您问“任何人都知道比以下更好的东西:alias | where {$ _。ResolvedCommandName -eq“ <command>”}}?”。只是alias -Definition *property(或任何其他模式)怎么样?我认为答案的问题在于,您正在将外壳程序和控制台进行混合:请记住,您可以选择具有不同编辑选项的控制台。他们故意破坏了DOS控制台的编辑,以鼓励人们使用其他控制台,例如ISE。
邓肯2014年

顺便说一句,您的!!示例可以用Powershell编写,(h -c 1) -replace '-1-','-2-' -replace '50','51' | iex但是使用向上箭头和单个命令进行编辑更容易。如果您想通过许多命令来执行此操作,我认为Powershell将会胜出。要重复10条以命令#255结尾的命令并进行编辑(h -c 10 -id 255) -replace '-1-','-2-' -replace '50','51' | iex,请执行以下操作:此外,Powershell的历史记录使您可以做Linux外壳中闻所未闻的事情。如果您回顾性地想知道命令要花多长时间:h -id 20 | select { $_.EndExecutionTime - $_.StartExecutionTime }
Duncan 2014年

@Duncan关于您对Shell和控制台的评论,我认为那只是Bash和PS之间的根本区别;也就是说:Bash 希望提供某种互动体验,而PS则“将”体验转移给其他事物。我对ISE控制台没有太多的经验,但是据我所记得,它也没有非常丰富的交互式体验。
埃里克·史密斯

@Duncan,是的-关于PS提供巧妙的历史技巧的能力的要点。
埃里克·史密斯

@Duncan ...但尽管您断言Linux外壳中闻所未闻:fc -e "sed -i -e 's/-1-/-2-/g' -e 's/50/51/g'" 10 255
Eric Smith

8

无论如何,我都不是一位经验丰富的PowerShell用户,但是我接触到的那一点点给我留下了深刻的印象。您可以将内置的cmdlet链接在一起,以完成在Unix提示符下可以执行的几乎所有操作,并且还有其他好处,例如可以导出到CSV,HTML表以及进行更深入的系统管理类型的工作。

如果确实需要sed之类的东西,那么总会有UnixUtilsGnuWin32,您可以很轻松地将它们与PowerShell集成。

作为一个长期的Unix用户,我习惯了命令命名方案确实遇到了一些麻烦,如果我对.NET有了更多的了解,我当然会从中受益匪浅。

因此,从本质上讲,如果Windows的唯一性没有问题,那么我值得学习。


1
有一个开源项目“ Pash”,可让您通过Mono在其他平台上运行PowerShell。 tinyurl.com/6dyoso
John D. Cook

哇!谢谢你的提示; 我等不及要尝试一下
yalestar

6

如果您喜欢Shell脚本,您将爱上PowerShell!

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


8
我喜欢Shell脚本并且可以忍受 PowerShell。它的命令和语法非常糟糕。冗长的命令选项,没有任何有用的命令完成。或者,如果没有找到它。太多的功能挤入了单个命令中,应将其分开。只有DOS批处理程序员才能喜欢的奇怪的变量和转义语法。
Zan Lynx

8
@Zan Lynx-您没找到东西是正确的。所有命令都有别名,其中许多都与DOS和UNIX命令匹配(ps,dir,rm,ls,kill,history,man,cat,clear等)。名称很长,因此它们具有有意义的名称。非常适合脚本-当新手必须使用和维护它时,它会有所帮助。cmdlet,函数,变量,路径,参数等都有选项卡扩展。大部分语法来自Unix shell,您在说什么转义语法?``不用于转义,因为它是Windows中的路径分隔符。
manojlds

3
@Zan Lynx-您的论点无效。要停止解释变量,请使用'(单引号)。对于双引号-相同,请使用write-output 'this is a "test"'。您要指向的问题是正则表达式,而正则表达式的转义在任何地方都有效。Powershell也具有Here-Strings或逐字字符串。甚至Java也没有这些!尝试在Java中转义正则表达式。而且有时您不使用文字路径。在需要时使用。LiteralPath逐字对待通配符,并且不对其进行扩展。您可以在文件拥有它时使用它。它给您更多选择。
manojlds

3
@manojlds:与bash shell相比,Powershell充满了没有意义的混乱,只是令人困惑。在bash中,您到处都使用相同的转义字符,并且文件路径与字符串一样被转义。您不需要特殊的参数。如果展开的变量中带有特殊字符,则将其放在双引号中,并且内容是安全的,无需调用函数即可对其进行转义。
Zan Lynx

5
@Zan Lynx-没有不一致之处。甚至write-output "this is a `"test`""有效。只需使用`代替“ \”即可。regex :: escape可以为您提供帮助,以免您错过转义的内容。没有必要使用它。您认为存在可以帮助您并防止错误的其他选项是不一致的。
manojlds

6

随着我最近的实验使我深入了解PowerShell和.NET调用,我必须说PowerShell 可以代替Cygwin和Unix shell。

我不确定Perl,但是由于PowerShell和Perl都已经完成了图灵编程语言的开发,因此我也同意取代Perl。

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

如何从SQL Server和其他数据提供程序收集数据,进行解析并将其导出为CSV,邮件,文本以及实际上任何现有和不存在的文件格式?(当然,具有从接收到的数据中创建有效文件的适当技能,但是CSV随时可用)。

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

关于实施了哪些命令-理查德的答案列出了它们以及PowerShell已模拟它们功能的功能。

关于PowerShell是否强大到可以进行切换的问题-这是个人喜好问题,尽管随着越来越多的Windows服务提供PowerShell cmdlet来控制它们,但不将PowerShell与这些服务结合使用被认为是一个障碍。(Hyper-V服务器是主要的此类服务,它还提供了使用PowerShell cmdlet进行处理而不是使用GUI进行处理的功能!)

答案可能是迟到了五年,但是,如果有人在Windows上执行管理任务或对各种内容进行通用脚本编写,则他们绝对应该尝试利用PowerShell实现其目的。


6

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

但是,您可以像从cmd.exe或Cygwin中一样从PowerShell调用任何命令。它重新实现特定的功能,它肯定是无法媲美的Perl。

它只是一个外壳,但是它使编程变得更容易,从而为.NET Universe提供了舒适的界面。

另外请记住,PowerShell需要Windows XP,Windows Server 2003或更高版本,根据您的IT基础架构,这可能会引起问题。

更新:

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

我针对以下问题发布了答案:将PowerShell与Cygwin,Perl和Bash进行比较。

PowerShell是一个外壳程序,因为它在内置命令,小命令,用户功能和外部命令(.exe,.bat,.cmd)之间没有语法差异。只有调用.NET方法的不同之处在于,在调用中添加了名称空间或对象。

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

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

在此之前,请享受比较


是的,我猜想当我谈论Unix“ shell”时,我还指的是Unix附带的所有常规实用程序,例如grep,awk等。我只是想知道PowerShell是否提供了类似的实用程序?盒子。
安迪·怀特2009年

3
Powershell不是“仅仅是一个外壳”。它是一种脚本语言。我想知道它在什么方面不能与perl相提并论?我承认它还不那么成熟,但是除此之外,我看不到差距。
EBGreen

@EBGreen,您对此评论的确切含义是什么?我同意任何shell或脚本语言在本质上都是相似的,但是我想知道PowerShell相对于bash / perl /其他unix shell /脚本语言的特定功能。
安迪·怀特2009年

2
Powershell具有令人难以置信的广泛功能。它是-交互式,可组合的外壳-丰富的交互式脚本语言-编程语言它还具有丰富的OO和tesxt实用程序功能集(即grep / awk / etc的等效功能)。
Jeffrey Snover-MSFT

1
@Andy-我理解Devio会说powershell不如Perl强大。我不相信那是真的,我只是想知道为什么他认为情况如此。
EBGreen

4

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计算机上曾经存在的最有用的文件夹。将该目录添加到您的路径,就可以开始了。


4

TL; DR-我不讨厌Windows或PowerShell。我只是无法在Windows或PowerShell上执行任何操作。


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

  • 目录路径的制表符补全不复杂,要求用户在每个名称补全后输入路径分隔符。
  • 我还是觉得像Windows甚至没有一个路径或路径是什么概念,没有访问用户家里指标~/的一些短@environment://somejibberish/%user_home%
  • NTFS仍然是一团糟,而且似乎总是如此。祝你好运。

  • cmd-esque界面,恐龙cmd.exe在PowerShell中仍然可见,编辑标记仍然是复制信息的唯一方法,并且仅以可见终端空间的矩形块形式复制。和编辑标记仍然是将字符串粘贴到终端的唯一方法。

  • 将其涂成蓝色不会使其更具吸引力。我不介意Microsoft开发人员对颜色有所了解。

  • Windows总是在屏幕的左上角打开。对于使用垂直任务栏的人来说,这非常令人讨厌,尤其是考虑到Windows任务栏将覆盖窗口的唯一一角,从而可以访问复制/粘贴功能。

对于Windows包含的工具,我不能说太多。拥有一整套开放源代码,免费许可的CLI工具,而就我所知,PowerShell附带了这些工具,这些都不是完全令人失望的。

  • PowerShell的wgetGNU wget看似无与伦比的参数。谢谢,一线希望的希望毫无用处。
  • PowerShell POSIX不与Bash兼容,特别&&是不处理运算符,这使得遵循以下条件的命令最简单

我不认识男人 我试了一下,我确实做到了。我仍然尝试尝试一下,希望下次打开它时,它会越来越有用。我无法在PowerShell中执行任何操作,而且我几乎无法在一个实际项目中将GNU工具引入Windows。

MySysGit使用几个GNU工具为我提供了恐龙cmd.exe提示符,但仍然很让人难以理解,但最后完成了工作。Git命令将在Git Bash中运行。

Mintty for MySysGit在mysysgit的环境上提供了Cygwin界面,使对象可以复制和粘贴(选择复制(鼠标),Shift+ Ins粘贴,多么现代...)。但是,诸如此类git push的东西在Mintty中是坏的。

我并不是要之以鼻,但即使使用Cygwin之类的工具,我仍然看到Windows上的命令行可用性存在巨大问题。


PS:仅仅因为可以在PowerShell中完成某些事情,就不能使它变得可用。可用性比能力更深,这是我尝试将产品用作消费者时倾向于关注的重点。


开启QuickEdit模式?选择并按Enter进行复制,按ctrl-v进行粘贴,不再需要Edit-> Mark或Edit-> Paste。在首选项中,设置窗口位置,然后取消选中“让系统位置窗口”。制表符完成不仅完成文件系统路径,还完成变量名,命令名,对象属性,您可能要键入.[访问属性或索引,因此不能仅在末尾添加路径分隔符。究竟是哪个PowerShell wget?哪个PowerShell POSIX?它不是在尝试将gnu工具引入Windows,也不是要与bash兼容。
TessellatingHeckler 2014年

是的,我知道这不是在努力。我避免在原始帖子中这样说。我会说哪个w可以获取二进制文件,但在Power Shell中没有“哪个”命令:(我不记得我在哪里购买了读取Power Shell应该与POSIX兼容
ThorSummoner 2014年

5
回复:“没有哪个”-> (get-command wg*.exe).Path。回复:bash完成和readline-> leeholmes.com/blog/2012/09/13/…导致github.com/lzybkr/PSReadLine
TessellatingHeckler

2

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

对于您的困境,最好使用其他人可能会喜欢的脚本语言,您提到的Perl或Ruby或Python之类的脚本语言。

我认为这很大程度上取决于您需要做什么。就我个人而言,我一直在使用Python编写自己的个人脚本,但是我知道当我开始编写某些东西时,我将永远无法通过它-因此,我尽量不要做任何革命性的事情。



1

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

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

效果很好。


0

我发现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站点上的所有示例都很琐碎,以至于一文不值。

编辑呵呵,当然,当我写这篇文章时,我四处摸索,发现我所缺少的东西:-recurseremove-item命令的选项有问题(如果使用,则显示出来get-help remove-item -detailed)。

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

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


16
我认为您将Windows脚本宿主(WSH)与PowerShell混淆了。他们完全不同。
Erik Funkenbusch

3
例如,如果要删除所有以.TMN结尾的文件,则可以发出以下命令get-childitem c:\ -include * .TMN -recurse | foreach($ _){删除项目$
_。fullname

@Mystere:我尝试过,但似乎没有用。经过一番摸索,*。tmn似乎是您所需要的(而不是仅.tmn)
redtuna 2010年

5
我不能再恭敬地不同意,我绝不是Windows专家。我发现PS比bash更容易编写脚本。PS更一致。使用Bash,您调用的任何控制台实用程序都有其自己的语法和独特的行为,并且bash语法本身相当隐晦。PS具有更强大的语言功能,例如匿名功能,(脚本块),参数验证,高级功能等。再加上可移植性模块的概念和许多其他功能。不过,主要是,最大的原因是您经常听到有关PS的事情,对象胜过文本。虽然Bash仍然更快。
user2233949 2015年


0

PowerShell非常强大,比Unix Shell的标准内置功能更强大(但这仅是因为它包括通常炮轰给子程序的许多功能)。另外,请考虑您可以用任何.NET语言编写小程序,包括IronPythonIronRuby,PerlNet等。或者您可以直接从PowerShell调用Cygwin命令,而忽略所有其他功能,并且其工作方式类似于Bash,KornShell,管他呢...


我认为您可能缺少Unix shell的设计目标。不用敲PowerShell(想自己了解更多信息),但是您需要了解Unix工具才能做出这样的声明。
JE队列

2
@Xepoch-不,我认为您缺少PowerShell的设计目标。PowerShell可以以与Unix Shell相同的方式完成Unix Shell可以执行的所有操作。但是,当您利用PS的对象管道系统而不是仅分析文本输出时,才有真正的力量。因此,PowerShell可以完全执行bash或korn可以执行的操作,但是它们不能执行PowerShell可以执行的操作。
Erik Funkenbusch

3
我只是不了解PowerShell,不足以对您进行批评,但是您很清楚地知道Unix shell的目标并不一定是外部工具的全面替代,而是围绕它的控制结构。再次,我现在不能比较也不能对比,但是要提升PowerShell,因为它具有更多的内置功能并不一定是Unix shell的福音。
JE队列

@Xepoch-重点是,您可以选择想要的方式。您可以使用内置shell的所有优点,也可以忽略并按照Unix的方式进行操作。这是你的选择。选择是好的,对吗?
Erik Funkenbusch'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.