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

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

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

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

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


当前回答

PowerShell中的cmdlet非常好,工作可靠。因为我是一名Java/ c#开发人员,所以它们的面向对象性非常吸引我,但这并不是一个完整的集合。由于它是面向对象的,因此它错过了POSIX工具集(例如awk和sed)的许多文本流成熟度。

The best answer I've found to the dilemma of loving OO techniques and loving the maturity in the POSIX tools is to use both! One great aspect of PowerShell is that it does an excellent job piping objects to standard streams. PowerShell by default uses an object pipeline to transport its objects around. These aren't the standard streams (standard out, standard error, and standard in). When PowerShell needs to pass output to a standard process that doesn't have an object pipeline, it first converts the objects to a text stream. Since it does this so well, PowerShell makes an excellent place to host POSIX tools!

最好的POSIX工具集是GnuWin32。它确实需要超过5秒钟的时间来安装,但这是值得的,据我所知,它不会修改你的系统(注册表,c:\windows\*文件夹等),除了将文件复制到你指定的目录。这是非常好的,因为如果您将工具放在共享目录中,许多人可以同时访问它们。

GnuWin32安装说明

下载并执行exe(它来自SourceForge网站)指向一个合适的目录(我将使用C:\bin)。它会在那里创建一个GetGnuWin32目录,你将在其中运行download.bat,然后是install.bat(不带参数),之后会有一个C:\bin\GetGnuWin32\gnuwin32\bin目录,这是Windows机器上曾经存在过的最有用的文件夹。将该目录添加到路径中,就可以开始了。

其他回答

我已经使用了一些PowerShell来实现脚本自动化。虽然环境看起来比Unix shell考虑得更周到,但实际上使用对象而不是文本流要笨拙得多,而且过去30年开发的许多Unix设施仍然缺失。

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

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

无论如何,我都不是一个非常有经验的PowerShell用户,但是我接触到的一点点PowerShell给我留下了深刻的印象。您可以将内置的cmdlet链接在一起,以完成您在Unix提示符下可以完成的任何事情,并且还有一些额外的优点,用于执行诸如导出到CSV、HTML表以及更深入的系统管理类型的作业。

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

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

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

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的任何团队资源管理器中公开的更详细的信息。

为什么不两者都用呢?在Cygwin中调用PowerShell脚本,就像其他解释性脚本(如Perl)一样。

为此,我编写了https://bitbucket.org/jbianchi/powershell,以便Bash包装器在Cygwin中调用powershell.exe。它可以用作PowerShell .exe .ps1脚本的第一行shebang(因为PowerShell也使用“#”作为注释)。参见https://bitbucket.org/jbianchi/powershell/wiki/Home获取示例