我在讨论是否应该学习PowerShell,或者只是坚持使用Cygwin / Perl脚本/ Unix shell脚本等。
PowerShell的好处是,没有Cygwin的队友可以更容易地使用这些脚本; 但是,我不知道我是否真的要编写那么多通用脚本,或者人们是否会使用它们。
Unix脚本是如此强大,PowerShell是否足够接近切换?
以下是我在PowerShell中寻找的一些具体事项(或等价物):
#1楼
您还可以尝试使用BashWin在Windows上运行Bash脚本,网址为https://github.com/skanga/BashWin 。
#2楼
PowerShell中的cmdlet非常好,工作可靠。 由于我是Java / C#开发人员,他们的面向对象对我很有吸引力,但它根本不是一套完整的。 由于它是面向对象的,因此错过了POSIX工具集的很多文本流成熟度( awk
和sed
仅举几例)。
我发现爱的OO技术和喜欢POSIX工具成熟的困境的最佳答案是使用两者! PowerShell的一个重要方面是它可以很好地将对象管道传输到标准流。 PowerShell默认使用对象管道来传输其对象。 这些不是标准流(标准输出,标准错误和标准输入)。 当PowerShell需要将输出传递给没有对象管道的标准进程时,它首先将对象转换为文本流。 由于它做得很好,PowerShell是托管POSIX工具的绝佳场所!
最好的POSIX工具集是GnuWin32 。 它确实需要5秒多的时间来安装,但是值得一试,据我所知,它不会修改你的系统(注册表, c:\\windows\\*
文件夹等),除了将文件复制到您指定的目录。 这是非常好的,因为如果您将工具放在共享目录中,许多人可以同时访问它们。
GnuWin32安装说明
下载并执行exe (它来自SourceForge站点 ),将其指向一个合适的目录(我将使用C:\\bin
)。 它将在那里创建一个GetGnuWin32
目录,你将在其中运行download.bat
,然后运行install.bat
(不带参数),之后会有一个C:\\bin\\GetGnuWin32\\gnuwin32\\bin
目录,这是最有用的文件夹,曾经存在于Windows机器上。 将该目录添加到您的路径中,您就可以开始了。
#3楼
在几行中,Cygwin和PowerShell是不同的工具,但是如果安装了Cygwin,则可以在PowerShell会话中运行Cygwin可执行文件。 我已经习惯了PowerShell,现在我不再使用grep,sort,awk等。在PowerShell中有很多内置的替代品,如果没有,你可以在那里找到一个cmdlet。
我发现自己使用的主要工具是ssh.exe,但在PowerShell会话中。
它很棒。
#4楼
为什么不同时使用? 在Cygwin中调用PowerShell脚本就像任何其他解释脚本一样,如Perl等。
我这样做了,我写了https://bitbucket.org/jbianchi/powershell作为Bash包装器来调用Cygwin中的powershell.exe。 它可以用作一个shebang作为powershell.exe .ps1脚本的第一行(因为PowerShell也使用“#”作为注释)。 有关示例,请参阅https://bitbucket.org/jbianchi/powershell/wiki/Home
#5楼
我最近才开始涉足任何严肃程度的PowerShell。 虽然在过去的七年里我一直在几乎完全基于Windows的环境中工作,但我来自Unix背景,发现自己不断尝试“Unix-fy”我在Windows上的交互体验。 至少可以说是令人沮丧的。
将PowerShell与Bash , tcsh或zsh之类的东西进行比较是公平的,因为grep , sed , awk , find等实用程序严格来说不是shell的一部分; 但是,它们始终是任何Unix环境的一部分。 像这就是说,一个PowerShell命令选择字符串有一个非常类似的功能grep和捆绑在PowerShell的核心模块...这样的线可有点模糊。
我认为关键是文化 ,以及各个工具集将体现各自文化的事实:
- Unix是基于文件的 (通常是非Unicode) 基于文本的文化。 配置文件几乎都是文本文件。 另一方面,Windows在配置格式方面总是更加结构化 - 配置通常保存在专有数据库(例如,Windows注册表)中,这些数据库需要专门的管理工具。
Unix管理(以及多年来的开发)接口传统上一直是命令行和虚拟终端。 的Windows开始作为一个GUI和行政职能最近才开始被完全基于GUI移开。 我们可以期待命令行上的Unix体验更丰富,更成熟,因为它在PowerShell上具有重要的领先优势,而且我的经验与此相符。 在此,根据我的经验:
Unix管理经验旨在以最少的击键次数轻松完成任务; 这可能是由于必须通过缓慢的9600波特拨号连接管理服务器的历史情况。 现在,PowerShell确实有一些别名可以解决相当冗长的Verb-Noun标准,但是了解这些别名有点痛苦(任何人都知道比
alias | where {$_.ResolvedCommandName -eq "<command>"}
更好:alias | where {$_.ResolvedCommandName -eq "<command>"}
?)。可以操纵历史的丰富方式的一个例子:
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头)。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3165805