我正在争论我是否应该学习PowerShell,还是坚持使用Cygwin/Perl脚本/Unix shell脚本等等。
PowerShell的好处是,没有Cygwin的队友可以更容易地使用脚本;然而,我不知道我是否真的会写那么多通用脚本,或者人们是否会使用它们。
Unix脚本功能如此强大,PowerShell是否足以让我们切换到它呢?
以下是我在PowerShell中寻找的一些具体内容(或等效内容):
grep
排序
uniq
Perl (PowerShell与Perl的能力有多接近?)
AWK
sed
File(提供文件信息的命令)
等。
握
Select-String cmdlet和-match操作符使用正则表达式。此外,您还可以直接使用. net的正则表达式支持来实现更高级的功能。
排序
sort - object更强大(比我记得*nix的sort更强大)。允许对任意表达式进行多级排序。在这里,PowerShell对底层类型的维护有所帮助;例如,DateTime属性将被排序为DateTime,而不必确保格式化为可排序的格式。
uniq
Select-Object独特
Perl (PowerShell的功能有多接近Perl ?)
就Perl领域特定支持库的广度而言:还远远不及(目前)。
对于通用编程来说,PowerShell当然更具有内聚性和一致性,也更容易扩展。文本修改的一个缺口相当于Perl的。操作符。
哗啦��
自从使用AWK以来已经足够长了(肯定是>18年了,因为后来我只使用Perl),所以不能真正评论。
赛德
(见上图)
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的任何团队资源管理器中公开的更详细的信息。
由于我最近的实验让我深入了解了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和脚本,可以获得额外的安全性,
组策略和执行策略有助于防止恶意代码在您的系统上运行,即使您以管理员身份运行它们。
关于执行什么命令——Richard的回答列出了它们以及PowerShell已经能够模拟它们的功能。
关于PowerShell是否强大到可以保证切换-这更多的是个人偏好的问题,尽管越来越多的Windows服务提供PowerShell cmdlet来控制它们,不使用这些服务的PowerShell被认为是一个障碍。(Hyper-V服务器是主要的这种服务,它还提供了使用PowerShell cmdlet比使用GUI做更多事情的能力!)
也许这个答案晚了五年,但是,如果有人在Windows上执行管理任务或各种东西的一般脚本,他们肯定应该尝试利用PowerShell来达到他们的目的。
当您将PowerShell与Cygwin/Perl/Shell组合进行比较时,请注意PowerShell仅表示该组合的“Shell”部分。
然而,您可以从PowerShell调用任何命令,就像从cmd.exe或Cygwin中调用一样。它没有重新实现指定的函数,当然也不能与Perl相比。
它“只是”一个外壳,但它使编程变得更容易,为。net世界提供了一个舒适的接口。
还要记住,PowerShell需要Windows XP、Windows Server 2003或更高版本,这可能会造成问题,具体取决于您的IT基础设施。
更新:
我不知道我的回答会引发什么样的哲学辩论。
我在这个问题的背景下发布了我的答案:将PowerShell与Cygwin、Perl和Bash进行比较。
PowerShell是一个shell,因为它在内置命令、命令行、用户函数和外部命令(.exe、.bat、.cmd)之间没有语法上的区别。只有在调用中添加名称空间或对象才能调用。net方法。
它的可编程性来源于。net框架,而不是任何特定于PowerShell“语言”的东西。
我想说,一旦Bugzilla或MediaWiki被实现为运行在web服务器上的PowerShell脚本,我相信PowerShell就是一种“脚本语言”。
在那之前,享受比较吧。