当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《PowerShell是否已准备好在Windows上替换我的Cygwinshell?》经验,为你挑选了10个好方法。

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

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

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

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

grep的

分类

uniq的

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

AWK

SED

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

等等

Jeffrey Snov.. 779

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

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

我最初的目的是在Windows中包含一组Unix工具并完成它(团队中的一些人拥有深厚的Unix背景和对该社区的健康尊重.)我发现这不是真的很有帮助.原因是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之后:-)).我们知道人们的学习预算非常有限 - 这就是为什么我们对一致性的超级核心.你将学习一些东西,然后你会一遍又一遍地使用它.

实验!请享用!从事!



1> Jeffrey Snov..:

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

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

我最初的目的是在Windows中包含一组Unix工具并完成它(团队中的一些人拥有深厚的Unix背景和对该社区的健康尊重.)我发现这不是真的很有帮助.原因是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之后:-)).我们知道人们的学习预算非常有限 - 这就是为什么我们对一致性的超级核心.你将学习一些东西,然后你会一遍又一遍地使用它.

实验!请享用!从事!


@Jeffrey:有没有机会为Windows提供更好的终端?Powershell是一种功能强大的脚本语言,但它在cmd.exe中运行的事实使它在交互模式下更加方便
这个"没有建设性"的问题产生了我在整个"在Unix上,一切都是文件"的口号中看到的最好的洞察力,以及为什么Windows不同.也许StackOverflow会更好地结束而不是建设性的_discussions_?
@sumek - 试试ConEmu; 我已经使用了几个星期而且非常可爱:http://www.hanselman.com/blog/ConEmuTheWindowsTerminalConsolePromptWeveBeenWaitingFor.aspx
感谢您的回答.我想我会继续学习PowerShell.从我到目前为止看起来它看起来很强大,我将能够在工作中编写更多有用的脚本.
抬头:powershell不喜欢管道二进制数据.所以当你打电话给你可靠的Unix工具时,请注意不要做`tar -c之类的东西.| 在PowerShell中直接使用gzip> package.tar.gz`**,否则你会受到影响.见http://brianreiter.org/2010/01/29/powershells-object-pipeline-corrupts-piped-binary-data/
@Interarticle - 这是powershell的已知行为.它默认将输出编码为utf-16.通过在命令行中添加`-encoding ascii`可以轻松解决这个问题.这与为ftp指定二进制模式没有什么不同.
一个很好的答案,但我遇到了一个令人讨厌的小惊喜与powershell.没有多会话历史支持!它被提到的唯一一次是在开发时代的非工作黑客.

2> Richard..:

grep的

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

分类

Sort-Object更强大(比我记得*nix的sort).允许对任意表达式进行多级排序.PowerShell对底层类型的维护有助于; 例如,DateTime属性将被排序为a,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的任一团队资源管理器中公开的更详细.


文本并不总是最好的格式(从数据库和光栅图像开始).但我认为我们可以同意不同意而不是公开格式的战争.
Powershell可以使用.NET框架中的任何对象,这不符合Perl的域功能吗?另外,如果你想重新使用,你可以用C#等编写cmdlet
问题是提供者模型很有意思,因为操作系统不使用文本作为其通用配置介质,因此您需要这些提供程序.使用UNIX,大多数语言都有API来触摸PAM,主机和包,但最终文本将始终存在.

3> Ubiguchi..:

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

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

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

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


好的,你的答案来自2011年.今天的powershell也在linux上运行.并且 - 我的个人观点 - bash太古怪了.语法很糟糕,我宁愿使用不同的脚本语言.如今python是大多数Linux发行版的标准配置,我认为没有任何理由将bash用于脚本.我建议你再次查看powershell,因为自2011年以来发生了很多事情.

4> Daishiman..:

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

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


使用对象是一种范式转换,需要一些时间来适应.但是避免在涉及结构化数据的每个步骤中进行整个重新解析(例如,不需要确保字段是分隔的).
汽车制造商也很难与1000多年的马争吵.我不是想轻浮.只是指出过去的成功并没有消除创新的潜在好处.
@Andy White @Daishiman,我可以理解PowerShell的学习曲线在哪里,但管道对象比管道文本更灵活.@Richard是对的.:)
@Daishiman - 我明白了.在实践中,人们发现这不是一个问题,而是一个巨大的优势.也就是说,我可以看到,如果你是一个专家文本解析器,这将是一项新的学习技能,起初可能会觉得不必要和尴尬.再次 - 无论有什么帮助都是正确的工具.
@daishiman - 对象的好处是,当你想要一个属性时,你要求它 - 你不必解析,猜测,施放.我不明白你的观点是"当对象没有兼容的方法时会发生什么" - 你能说另一种方式还是举一个问题的例子?谢谢.
我认为程序员尤其会理解强类型属性的需要,而不是随机的perlthon文本解析,如果没有你甚至知道它之前出现任何问题,那么为时已晚?^^
这不仅仅是学习曲线.很难与纯文本的力量争论.30多年来处理文本的工具很难争论.
我同意你关于创新的观点.我真的不同意管道对象比管道文本更强大的观点.如果您是管道对象,则所有命令行工具都必须了解对象.纯文本是所有语言都能理解的最低标准.
对象可以更灵活,但这并不意味着解析它们是微不足道的.是的,使用文本你有格式问题,但awk,sed和perl主要解决了这个问题.当对象没有兼容的方法时会发生什么?音译对象比文本困难得多.
我同意使用.NET对象而不是文本流.使用纯文本非常强大,使命令链变得如此简单
@Daishiman - 我完全赞同你的观点.处理对象或专有配置机制(而不是纯文本)是使Windows在命令行上难以处理的原因.
另一件事:你没有得到MSH,你没有得到Perl或Python,而且两者都是完全成熟的语言,完成得更多,因为它们比bash更冗长,但与MSH相同(和更可读),我仍然没有看到优势.
问题在于,如果你正在处理一堆不同的对象,你需要内省来处理它们的不同方法和属性,这意味着唯一的共同点是文本,所以你要回到原点,'没有没有你常用的UNIX文本工具.
unix工具非常棒且先进.但是根据具有如此多列的文本输出和我想要的特定列并不是那么好.如果命令更改了该行,该怎么办?你整洁的小脚本坏了.并不是说你不能用Powershell做类似的文本操作.但是你确实有处理完全保真对象的优势.Powershell可能永远不会像bash等那样强大,但确实让这方面变得正确.

5> Vic..:

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

grep =" Select-String -Pattern "

sort = "Sort-Object"

uniq =" 获得独特 "

file =" Get-Item "

cat =" 获取内容 "

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


@EvgeniSergeev以上所有内容默认分别为`sls`,`sort`,`gu`,`gi`,`gc`.在一个系统中具有tab-complete和短类型名称的长可读名称.这对您来说是用户友好的进步.
你能相信我们的祖先被迫使用的神秘的四字母命令吗?

6> Eric Smith..:

我最近才开始涉足任何严肃程度的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开始作为一个GUI和行政职能最近才开始被移开完全基于GUI.我们可以期待命令行上的Unix体验更丰富,更成熟,因为它在PowerShell上具有重要的领先优势,而且我的经验与此相符.在此,根据我的经验:

Unix管理经验旨在以最少的击键次数轻松完成任务; 这可能是由于必须通过缓慢的9600波特拨号连接管理服务器的历史情况.现在,PowerShell确实有一些别名,它们可以绕过相当冗长的Verb-Noun标准,但是了解这些别名有点痛苦(任何人都知道比...更好的东西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

这意味着"执行上一个命令,但-1--2-50替换51.

Unix体验针对触摸打字员进行了优化; 一个人可以在不离开"家"位置的情况下完成所有工作.例如,在Bash中,使用Emacs键绑定(是的,Bash也支持vi绑定),循环历史记录是使用Ctrl-P并且Ctrl-N在移动到行的开始和结束时分别使用Ctrl-ACtrl-E完成...并且它绝对是并不止于此.尝试在PowerShell控制台中进行最简单的导航,而无需离开原位并遇到麻烦.

简单的东西,比如Unix上的多功能分页(不少)在PowerShell中似乎没有开箱即用,这有点令人沮丧,而且丰富的编辑器经验也不存在.当然,人们总是可以下载填补这些空白的第三方工具,但如果这些东西只是"存在"就好了,就像它们几乎任何类型的Unix一样.

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

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



7> yalestar..:

无论如何,我不是一个非常有经验的PowerShell用户,但是我接触过的一点点让我印象深刻.您可以将内置cmdlet链接在一起,以完成您在Unix提示符下可以执行的任何操作,还可以执行诸如导出到CSV,HTML表以及更深入的sys-admin类型之类的操作.工作.如果你真的需要像sed这样的东西,总会有UnixUtils或GnuWin32,你可以很容易地与Powershell集成.

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

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



8> Nick..:

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

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


我喜欢shell脚本,我*容忍*PowerShell.它的命令和语法都是残暴的.可怕的长命令*和*选项没有任何有用的命令完成.或者,如果有,我还没有找到它.太多的功能都塞进了应该分离出来的单个命令中.奇怪的变量和转义语法只有DOS批处理程序员才会喜欢.
@Zan Lynx - 你没找到东西是对的.所有命令都有别名,其中许多命令都匹配DOS和UNIX命令(ps,dir,rm,ls,kill,history,man,cat,clear等)名称很长,因此它们具有有意义的名称.非常适合脚本 - 当新人必须使用和维护脚本时,它会有所帮助.有cmdlet,函数,变量,路径,参数等的tab扩展.大部分语法来自Unix shell,你在谈论什么转义语法?`\`不用于转义,因为它是Windows中的路径分隔符.
@Zan Lynx - 没有不一致之处.即使是"写输出",这也是一个"测试".只需使用`\``而不是`\\`.regex :: escape存在可以帮助您,以便您不会错过任何逃避的东西.没有必要使用它.您认为可以帮助您并防止错误的其他选项是不一致的.
@Zan Lynx - 你的论点无效.要停止解释变量,请使用`'`(单引号).对于双重双引号 - 同样,使用`write-output'这是一个"测试"'`.您指向的问题是Regex,正则表达式的转义在任何地方都有效.Powershell也有Here-Strings/verbatim字符串.即便是Java也没有这些!尝试在Java中转义正则表达式.你有时不使用文字路径.您需要时使用.LiteralPath逐字处理通配符,不会扩展它们.你的文件有它时使用它.它为您提供了更多选择.
@manojlds:与bash shell相比,Powershell充满了不一致的东西,没有任何意义,只是令人困惑.在bash中,你在任何地方使用相同的转义字符,文件路径就像字符串一样被转义.您不需要特殊参数.如果展开其中包含特殊字符的变量,则将其放在双引号中并且内容是安全的,无需调用函数来重新转义它.
我不确定你的结论 - 但这篇文章看起来很有用.谢谢.

9> devio..:

将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就是一种"脚本语言";)

在此之前,享受比较.


Powershell不是"只是一个壳".它是一种脚本语言.我想知道它与perl的可比性是什么?我承认它并不那么成熟,但除此之外,我没有看到这种差异.
Powershell具有非常广泛的功能.它是 - 一个交互式,可组合的shell - 一种丰富的交互式脚本语言 - 一种编程语言它具有丰富的OO和tesxt实用程序功能(即grep/awk/etc的等价物).

10> Vesper..:

由于我最近的实验使我深入了解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和脚本,组策略和执行策略,可以提供额外的安全性,即使您以管理员身份运行它们,也可以帮助防止恶意代码在您的系统上运行.

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

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

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

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有