我在讨论是否应该学习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之后:-)).我们知道人们的学习预算非常有限 - 这就是为什么我们对一致性的超级核心.你将学习一些东西,然后你会一遍又一遍地使用它.
实验!请享用!从事!
工具只是工具.
他们帮助或他们不帮助.
你需要帮助,或者你不需要帮助.
如果你知道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之后:-)).我们知道人们的学习预算非常有限 - 这就是为什么我们对一致性的超级核心.你将学习一些东西,然后你会一遍又一遍地使用它.
实验!请享用!从事!
grep的
Select-String
cmdlet和-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
返回FileInfo
或FolderInfo
对象),这就是整个提供者模型.
您可以将注册表,证书存储区,SQL Server,Internet Explorer的RSS缓存等视为可由与文件系统相同的cmdlet导航的对象空间.
PowerShell绝对是Windows的前进方向.微软已将其作为未来非家用产品需求的一部分.因此在Exchange中支持丰富,支持SQL Server.这只会扩大.
最近的一个例子是TFS PowerToys.许多TFS客户端操作都是在不必每次都启动tf.exe的情况下完成的(这需要新的TFS服务器连接等),并且特别容易进一步处理数据.除了允许对整个TFS客户端API的广泛访问比在TF.exe的任一团队资源管理器中公开的更详细.
作为一个从1997年到2010年开始专注于Windows企业开发的人,显而易见的答案是PowerShell,因为之前给出的所有好理由(例如,它是微软企业战略的一部分;它与Windows/COM/.NET完美集成;以及使用对象而不是文件提供了"更丰富"的编码模型.出于这个原因,我在过去两年左右的时间里一直在使用和推广PowerShell,并且明确相信我遵循了"比尔的话".
然而,作为一个实用主义者,我不再相信PowerShell是一个很好的答案.虽然它是一个出色的Windows工具,并且为填补Window命令行的历史漏洞提供了急需的一步,因为我们都看到微软对消费者计算失误的控制,微软似乎越来越有可能将其操作系统保持为对未来的企业很重要.
事实上,鉴于我发现我的工作越来越多地处于异构环境中,我发现目前使用Bash脚本更有用,因为它们不仅可以在Linux,Solaris和Mac OS X上运行,而且还可以使用Cygwin-on Windows的帮助.
因此,如果您认为操作系统的未来是商品化的而不是垄断的,那么选择敏捷的开发工具策略似乎是有意义的,这种策略在可行的情况下远离专有工具.但是,如果你看到你的未来被所有那个Redmond所主宰,那么就选择PowerShell.
我使用了一些PowerShell来实现脚本自动化.虽然很好的环境似乎比Unix shell更经常考虑,但实际上使用对象而不是文本流更加笨重,并且在过去30年中开发了许多Unix工具.年仍然缺失.
Cygwin仍然是Windows主机的首选脚本环境.在完成任务方面,它肯定胜过其他选择.
这里有很多很棒的答案,这是我的看法.如果你是的话,PowerShell已准备就绪......示例:
grep =" Select-String -Pattern "
sort = "Sort-Object"
uniq =" 获得独特 "
file =" Get-Item "
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开始作为一个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-A和Ctrl-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头).
无论如何,我不是一个非常有经验的PowerShell用户,但是我接触过的一点点让我印象深刻.您可以将内置cmdlet链接在一起,以完成您在Unix提示符下可以执行的任何操作,还可以执行诸如导出到CSV,HTML表以及更深入的sys-admin类型之类的操作.工作.如果你真的需要像sed这样的东西,总会有UnixUtils或GnuWin32,你可以很容易地与Powershell集成.
作为一个长期的Unix用户,我在使用命令命名方案时遇到了一些麻烦,如果我知道更多的.NET,我肯定会从中受益更多.
所以基本上,我说如果它的Windows唯一性不会造成问题,那么值得学习它.
如果你喜欢shell脚本,你会喜欢PowerShell!
从Microsoft Command Shell(Ars Technica)的导览开始.
将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和.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来达到他们的目的.