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

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

Unix脚本功能如此强大,PowerShell是否足以让我们切换到它呢?

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

grep 排序 uniq Perl (PowerShell与Perl的能力有多接近?) AWK sed File(提供文件信息的命令) 等。


当前回答

由于我最近的实验让我深入了解了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用户,但是我接触到的一点点PowerShell给我留下了深刻的印象。您可以将内置的cmdlet链接在一起,以完成您在Unix提示符下可以完成的任何事情,并且还有一些额外的优点,用于执行诸如导出到CSV、HTML表以及更深入的系统管理类型的作业。

如果你真的需要像sed这样的东西,总有UnixUtils或GnuWin32,你可以很容易地与PowerShell集成。

作为一个长期的Unix用户,我在习惯命令命名方案时遇到了一些麻烦,如果我了解更多的。net,我肯定会从中受益更多。

所以本质上,我认为如果windows独有的特性不构成问题,它是非常值得学习的。

PowerShell功能非常强大,比Unix shell的标准内置功能更强大(但这只是因为它包含了许多通常分配给子程序的功能)。另外,考虑到你可以用任何。net语言编写小程序,包括IronPython、IronRuby、PerlNet等。或者你可以简单地从PowerShell调用你的Cygwin命令,忽略所有额外的功能,它将类似于Bash, KornShell,或任何…

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

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

效果很好。

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

然而,作为一个实用主义者,我不再确定PowerShell是一个很好的答案。虽然这是一款出色的Windows工具,并且为填补Windows命令行这一历史性的漏洞提供了非常必要的一步,但我们都看到微软对消费者计算的控制正在下滑,微软似乎越来越有可能面临一场大规模的战斗,以保持其操作系统对未来企业的重要性。

事实上,鉴于我发现我的工作越来越多地处于不同的环境中,我发现目前使用Bash脚本要有用得多,因为它们不仅可以在Linux、Solaris和Mac OS X上工作,而且还可以在cygwin的帮助下在Windows上工作。

因此,如果您相信操作系统的未来是商品化的,而不是垄断的,那么选择一种灵活的开发工具策略,在可行的情况下远离专有工具似乎是有意义的。然而,如果你认为你的未来被所有的雷德蒙德所主宰,那么就选择PowerShell吧。

我发现PowerShell编程不值得付出努力。

我有几年在Unix下编写shell脚本的经验,但是我发现用PowerShell做任何事情都非常困难。

似乎许多函数都需要您查询Windows管理界面并发出类似sql的命令来获得所需的信息。

例如,我想编写一个脚本来从目录树中删除具有特定后缀的所有文件。在Unix下,这将是一个简单的…

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

在几个小时的脚本之后。FileSystemObject和WScript。Shell并发出“SELECT * FROM Win32_ShortcutFile WHERE Drive = '”& Drive & " and Path = '" & searchFolder & "'”,我最终放弃了,并解决了Windows资源管理器的搜索命令,只是手动执行。可能有一些方法可以做到我想要的,但我没有看到任何明显的东西,MSDN网站上的所有示例都是如此微不足道,以至于毫无价值。

EDIT嘿,当然,当我写这篇文章的时候,我又戳了一下,发现了我遗漏的东西:remove-item命令的-递归选项是错误的(如果你使用get-help remove-item -detailed就会显示出来)。

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

事实证明你需要使用get-childitem -filter '*。Xyz ' -递归| remove-item