PowerShell是否准备好在Windows上replace我的Cygwin shell?
我在辩论是否应该学习PowerShell,或者只是坚持使用Cygwin / Perl脚本/ Unix shell脚本等。
PowerShell的好处在于,没有Cygwin的队友可以更轻松地使用脚本; 然而,我不知道我是否真的在写这么多的通用脚本,或者甚至人们会使用它们。
Unix脚本function非常强大,PowerShell能够保证切换吗?
以下是我将在PowerShell中查找的一些特定事物(或等价物):
- grep的
- 分类
- uniq的
- Perl(PowerShell与Perl的function有多近?)
- AWK
- SED
- 文件(提供文件信息的命令)
- 等等
工具只是工具。
他们帮助或者他们不帮助。
你需要帮助,否则你不需要帮助。
如果你了解Unix,那些工具可以在Windows上完成你所需要的工作 – 那么你是一个快乐的人,不需要学习PowerShell(除非你想探索)。
我最初的意图是在Windows中包含一套Unix工具,并用它来完成(团队中的许多人都具有深厚的Unix背景,并且尊重该社区。)我发现的是,这没有真的帮助很大。 原因是awk / grep / sed不能对付COM,WMI,ADSI,registry,证书库等等。换句话说,UNIX是围绕文本文件自我调整的整个生态系统。 因此,文本处理工具是有效的pipe理工具。 Windows是一个完全不同的生态系统,围绕API和对象进行自我调整。 这就是我们发明PowerShell的原因。
我想你会发现,在很多情况下,当文本处理不能在Windows上得到你想要的。 在这一点上,你会想拿起PowerShell。 注 – 这不是一个全部或没有处理。 在PowerShell中,你可以调用你的Unix工具(并使用他们的文本处理或者PowerShell的文本处理)。 你也可以从你的Unix工具调用PowerShell并获取文本。
再次 – 这里没有宗教 – 我们的重点是给你的工具,你需要成功。 这就是为什么我们如此热衷于反馈。 让我们知道我们在工作中所处的位置,或者您没有所需工具的地方,然后放在清单上并加以解决。 老实说,我们正在挖掘一个30年的洞,所以需要一段时间。 也就是说,如果你拿起Windows Server 2008 R2的testing版和/或我们服务器产品的testing版,我想你会惊讶于这个漏洞有多快被填满。
在使用方面 – 迄今为止我们已经有超过350万的下载量。 这不包括在Windows Server 2008中使用它的人,因为它作为一个可选组件包含在内,不需要下载。 V2将在所有版本的Windows中发布。 除了服务器核心版本之外的所有版本,它都是默认的,它是一个可选的组件。 在Windows 7 / Windows Server 2008 R2发布后不久,我们将在所有平台XP和更高版本上提供V2。 换句话说,您的学习投资将适用于大量的机器/环境。
最后一个评论。 如果/当你开始学习PowerShell时,我想你会很开心的。 大部分的devise都受到我们的Unix背景的严重影响,所以当我们完全不同时,你会很快地捡起它(在你过度诅咒它不是Unix之后:-))。 我们知道人们对学习的预算非常有限 – 这就是为什么我们对于一致性的超级核心。 你会学到一些东西,然后你会反复使用它。
实验! 请享用! 从事!
grep的
Select-String
cmdlet和-match
运算符使用正则expression式。 你也可以直接利用.NET的regex支持更高级的function。
分类
Sort-Object
更强大(比我记得* nix的sort
)。 允许对任意expression式进行多级sorting。 在这里,PSH的底层types的维护有助于; 例如, DateTime
属性将被sorting为DateTime
而不必确保格式化为可sorting的格式。
uniq的
Select-Object -Unique
Perl(PowerShell与Perlfunction有多近?)
就Perl的领域特定支持库的广度而言:无处不在(尚未)。
对于一般的编程,PSH肯定是更加内聚和一致的,并且更容易扩展。 文本消除的一个缺口是相当于perl的..
操作符。
AWK
自从使用awk(必须大于18年,因为后来我只是用perl)已经足够长了,所以不能真正发表评论。
SED
[往上看]
文件(提供文件信息的命令)
PSH在这里的优势并不在于它能够处理文件系统对象(它在这里获得完整的信息, dir
返回FileInfo
或FolderInfo
对象)就是整个提供者模型。
您可以将registry,证书存储,SQL Server,IE的RSScaching等视为可以通过与文件系统相同的cmdlet进行导航的对象空间。
PSH绝对是Windows上的前进方向。 MS已经使其成为未来非家用产品的一部分要求。 因此,在Exchange中支持SQL Server的丰富支持,这只会扩展。
最近的一个例子是TFS PowerToys。 许多TFS客户端操作都是在不需要每次启动tf.exe的情况下完成的(这需要一个新的TFS服务器连接等),并且特别容易进一步处理数据。 以及允许广泛访问整个TFS客户端API比在TF.exe的团队资源pipe理器中公开的更多的细节。
作为一个从事Windows企业开发工作的人,从1997年到2010年,Powershell有了上述的所有好的理由(例如,MS是企业战略的一部分,它与Windows / COM / .NET很好地集成在一起,对象而不是文件提供了“更丰富”的编码模型)。 出于这个原因,我在过去两年左右一直在使用和推广Powershell,并且明确地相信我遵循了“比尔之语”。
然而,作为一个实用主义者,我不再确定Powershell是一个很好的答案。 虽然它是一个出色的Windows工具,并且为填补Window命令行中的历史遗留问题提供了一个非常需要的步骤,因为我们都在观察MS如何控制消费者的计算漏洞,MS似乎越来越有可能在保留OS对未来的企业来说是重要的。
事实上,鉴于我发现我的工作越来越多地处于异构环境中,我发现现在使用bash脚本更有用,因为它们不仅在Linux,Solaris和Mac OS X上工作,而且还可以与在Windows上的Cygwin的帮助。
因此,如果您认为操作系统的未来是商品化的而不是垄断的话,那么select敏捷的开发工具战略,在可行的情况下远离专有工具似乎是有意义的。 但是,如果你看到你的未来被所有那是雷德蒙德统治,那么去Powershell。
我已经使用了一些PowerShell进行脚本自动化。 虽然这个环境似乎被认为比Unix的shell要好得多,但是在实践中,使用对象而不是文本stream是非常笨拙的,而且在过去30年中开发的许多Unix设施几年仍然失踪。
Cygwin仍然是Windows主机首选的脚本环境。 它确实在完成任务方面胜过了select。
我只是最近才开始在PS里涉足任何程度的严肃性。 虽然在过去的七年中,我几乎完全是在基于Windows的环境中工作,但是我来自Unix背景,发现自己经常试图在Windows上“unix-fy”我的交互体验。 至less可以说是令人沮丧的。
将PS与Bash , tcsh或zsh等东西进行比较是公平的,因为像grep , sed , awk , find等实用程序严格来说不是shell的一部分; 他们将永远是任何Unix环境的一部分。 也就是说,像Select-String这样的PS命令与grep有着非常相似的function,并且作为PS中的一个核心模块捆绑在一起…所以线条可能会有些模糊。
我认为关键是文化 ,各自的工具集将体现各自的文化:
- Unix是一种基于文件的 (一般来说,非Unicode) 基于文本的文化。 configuration文件几乎都是文本文件。 另一方面,Windows在configuration格式方面一直比较结构化 – configuration通常保存在专用数据库(如Windowsregistry)中,这些数据库需要专门的pipe理工具。
-
Unixpipe理(多年来,开发)接口传统上是命令行和虚拟terminal。 Windows作为一个GUI开始,而pipe理function最近才开始脱离专门的 GUI。 我们可以预期命令行上的Unix经验将会更丰富,更成熟,因为它在PS上占有重要地位,而且我的经验与此相匹配。 就此而言,以我的经验:
-
Unixpipe理经验的目的是让事情在最less的击键中轻松完成。 这可能是由于必须通过缓慢的9600波特率拨号连接来pipe理服务器的历史情况的结果。 现在, PS确实有一些别名,这些别名在很长一段时间内可以避开比较冗长的Verb-Noun标准,但是了解这些别名有点痛苦(任何人都知道比以下更好的东西:
alias | where {$_.ResolvedCommandName -eq "<command>"}
?)。历史可以被操纵的丰富方式的一个例子:
iptables
命令往往是冗长的,重复它们的细微差别将是一个痛苦,如果它不是许多纯粹的历史操纵内置function之一,所以插入一个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
意思是“执行前面的命令,但用
51
代替-1-
和50
。 -
Unix体验针对触摸打字员进行了优化; 一个人几乎可以做任何事情,而不用离开“家”的位置。 例如,在Bash中 ,使用Emacs密钥绑定(是的,Bash也支持vi绑定),使用Ctrl-P和Ctrl-N完成历史logging的循环,同时移动到行的开始和结束使用Ctrl- A和Ctrl-E分别…它绝对不会在那里结束。 尝试在PS控制台中进行最简单的导航,而无需从原始位置移开,并且遇到麻烦。
- Unix上的多function分页(ala less )等简单的东西在PS中似乎并不可用,这有些令人沮丧,而且丰富的编辑器体验也不存在。 当然,我们总是可以下载第三方工具来填补这些空白,但是如果这些东西只是“在那里”,就好像它们具有Unix的味道一样。
-
- 至less在系统API方面,Windows文化主要由支持框架(即COM和.NET)驱动 ,两者都是高度结构化和基于对象的。 另一方面,访问Unix API通常是通过文件接口(
/dev
和/proc
)或(非面向对象的)C风格的库调用。 那么脚本体验与他们各自的操作系统范例相匹配就不足为奇了。 PS本质上是结构化的(一切都是对象),而Bash和Friends是基于文件的。 PS程序员可以使用的结构化API非常广泛(基本上与现有的标准COM和.NET接口集合相当)。
简而言之,虽然PS的脚本function可以说比Bash更强大(尤其是当您考虑.NET BCL的可用性时),但交互式体验显着减弱,特别是如果您是从完全由键盘驱动,基于控制台的angular度(尽可能多的Unix主pipe)。
很多伟大的答案,这是我的要求。 PS已经准备好了,如果你是…例子
grep =“ selectstring – 模式 ”
sort = “Sort-Object”
uniq =“ Get-Unique ”
file =“ Get-Item ”
cat =“ Get-Content ”
Perl / Awk / Sed不是命令,但是实用程序很难比较,但是你几乎可以在Powershell中做所有的事情。
我不是一个非常有经验的PowerShell用户,但是我所暴露的一点点让我印象深刻。 您可以将内置cmdlet链接在一起,以完成Unix提示中可以执行的任何操作,还有一些额外的function可用于执行导出到CSV,HTML表格等更深入的系统pipe理员types工作。 如果你真的需要像sed这样的东西,总是有UnixUtils或者GnuWin32 ,你可以很容易地与Powershell集成。
作为一个长期的Unix用户,我习惯了命令命名scheme,但是我确实有点麻烦,如果我知道更多的.NET,我肯定会从中受益更多。
所以从本质上说,如果Windows的唯一性不会造成问题,那么我认为非常值得学习。
如果你喜欢shell脚本,你会喜欢PowerShell!
从Microsoft Command Shell (Ars Technica)的导览开始。
当您将PowerShell与组合Cygwin / Perl / Shell进行比较时,请注意,PowerShell仅表示该组合的“Shell”部分。
但是,您可以像从cmd.exe或Cygwin那样从PowerShell调用任何命令。 它不会重新实现指定的function,它当然不能与Perl相提并论。
这只是一个“壳”,但它使得编程更容易,为.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都是Turing作为编程语言完成的,所以我也把它当作replacePerl的一个好方法。 Powershell在* nix下的Cygwin和普通bash之上的一件事就是它能够执行沙盒DLL调用,通过直接的API调用,WMI方法甚至COM对象操纵操作系统。 如何通过代码启动IE,然后用显示的文档做任何你想要的,有效地模拟一个Web服务器的后端? 如何收集来自SQL服务器和其他数据提供者的数据,parsing它们并导出为CSV,邮件,文本以及实际上任何types的现有和不存在的文件格式? (当然有适当的技能来创build一个有效的文件,当然,但CSV是随时可用)而且有一个额外的安全可用通过签名的cmdlet和脚本,组策略和执行策略,有助于防止恶意代码运行在您的系统,即使您以pipe理员身份运行它们。
关于什么命令被实现 – 理查德的答案列出了他们和Powershell已经能够模仿他们的function。
关于PowerShell是否强大,可以保证切换 – 这更多的是个人喜好,尽pipe随着越来越多的Windows服务提供Powershell cmdlet来控制它们,Powershell不会使用这些服务,这被认为是一个障碍。 (Hyper-V服务器是主要的这种服务,它还提供了使用Powershell cmdlet比使用GUI更多的function!)
可能这个答案迟了五年,但是如果有人在Windows上执行pipe理任务或者一般的脚本,他们肯定会尝试利用Powershell来达到目的。
TL; DR – 我不讨厌Windows或Powershell我只是不能在Windows或PowerShell中做任何事情。
我个人仍然觉得powershell充其量是最好的。
- 目录path的选项卡完成不复合,需要用户在每个名称完成后inputpath分隔符。
- 我仍然觉得窗户甚至没有path或path的概念,没有可访问的用户家庭指标
~/
缺less一些@environment://somejibberish/%user_home%
-
NTFS仍然是一团糟,看起来总是会的,祝你好运导航。
-
cmd-esque界面,恐龙cmd.exe在Powershell中仍然可见,
edit->mark
仍然是复制信息的唯一方法,只能以可见terminal空间的矩形块的forms进行复制。edit->paste
仍然是将string粘贴到terminal的唯一方法。 -
把它画成蓝色并不会使它变得更有吸引力。 我不介意MS开发人员尝试色彩。
-
Windows始终在屏幕的左上angular打开,对于使用垂直任务栏的人来说,这是令人难以置信的烦恼,特别是考虑到Windows任务栏将覆盖可访问复制/粘贴function的唯一窗口。
我无法说出太多的工具窗口包括的理由。 因为有一整套开放源代码,免费授权的cli工具,而且据我所知,powershell也没有一个是完全令人失望的。
- powershell
wget
带给gnu wget看似无与伦比的参数,感谢一线希望的无用的希望。 - powershell posix不是bash兼容的,特别是
&&
操作符不被处理,使得最简单的条件命令不是一件事情。
我不知道男人,我给了它一个镜头,我真的做到了; 我仍然试图在下次打开它的时候给它一个希望,那将是没用的。 我不能在PowerShell中做任何事情,我可以忍受做一个真正的项目,把GNU工具带到Windows上。
MySysGit为我提供了dinosur cmd.exe提示符和一些gnu工具,但仍然非常令人沮丧,但最后的path完成工作。 而git命令将在gitBash中运行
Mintty for MySysGit通过mysysgit的环境提供Cygwin接口,进行复制和粘贴。 (select复制(鼠标), 移动 +粘贴,如何现代…)但是,像git push
东西在Mintty中被打破。
我并不是要咆哮,但是即使有像Cygwin这样的工具,我仍然在Windows上看到命令行可用性方面的巨大问题。
PS只是在PowerShell中做一些事情,不能使它变得可用 ,可用性比能力更深,而且当我试图用产品作为消费者的时候,我倾向于关注它。
在powershell中的cmdlet是非常好的,可靠地工作。 因为我是一个java / C#开发人员,所以他们的面向对象性吸引了我很多,但它并不是一个完整的集合。 由于它是面向对象的,所以错过了很多POSIX工具集( awk
和sed
等等)的文本stream成熟度。
我发现,爱好面向对象技术和在POSIX工具中成熟的困境,最好的答案就是使用两者! Powershell的一个重要方面就是它可以很好地将对象传送给标准stream。 Powershell默认使用对象pipe道来传输对象。 这些不是标准stream(标准输出,标准错误和标准input)。 当Powershell需要将输出传递给没有对象stream水线的标准stream程时,它首先将对象转换为文本stream。 既然它做得这么好,Powershell就成为了一个很好的托pipePOSIX工具的地方!
最好的POSIX工具集是GnuWin32 。 它需要超过5秒的安装,但它是值得的麻烦,据我所知,它不会修改您的系统(registry, c:\windows\*
文件夹等),除了复制文件到你指定的目录。 这是非常好的,因为如果你把工具放在一个共享目录中,很多人可以同时访问它们。
GnuWin32安装说明
下载并执行exe文件 (来自SourceForge站点 ),将其指向一个合适的目录(我将使用c:\bin
)。 它会创build一个GetGnuWin32
目录,在这个目录中你将运行download.bat
,然后是install.bat
(不带参数),之后会有一个c:\bin\GetGnuWin32\gnuwin32\bin
目录,它是最有用的文件夹曾经在Windows机器上存在。 将该目录添加到您的path中,然后就可以开始了。
我还没有看到Powershell真的起飞了,至less现在还没有。 所以,除非你的团队中的其他人已经知道,否则不值得去学习。
为了你的困境,你可能会用其他人可能得到的脚本语言,像你提到的Perl,或者像Ruby或Python这样的其他语言。
我想这很大程度上取决于你需要做什么。 就我个人而言,我一直在使用Python作为自己的个人脚本,但是我知道什么时候开始写一些我永远无法传递的东西 – 所以我尽量不要做太过革命性的事情。
为什么不使用两个? 在Cygwin中调用PowerShell脚本就像任何其他解释的脚本,如Perl等
我这样做,我写了一个bash包装https://bitbucket.org/jbianchi/powershell来调用Cygwin中的powershell.exe。; 可以用作Shebang作为powershell.exe .ps1脚本的第一行(因为powershell也使用“#”作为注释)。 有关示例,请参阅https://bitbucket.org/jbianchi/powershell/wiki/Home
PowerShellfunction非常强大,比Unix shell的标准内置function更强大(但仅仅是因为它包含了许多通常用于子程序的function)。 另外,考虑到你可以使用任何.NET语言编写applet,包括IronPython,IronRuby,PerlNet等。或者你可以直接从PowerShell中调用你的cygwin命令,忽略所有额外的function,它的工作原理和bash,korn,pipe他呢…
In a couple of lines, Cygwin and Powershell are different tools however if you have Cygwin installed you can run the Cygwin executables within a Powershell session. I've gotten so used to Powershell that now I no longer use grep, sort, awk, etc. There are pretty much built-in alternatives in Powershell, and if not you can find a cmdlet out there.
The main tool I find myself using is ssh.exe but within a Powershell session.
很好用。
You can also try running Bash scripts on windows using BashWin at https://github.com/skanga/BashWin
I found PowerShell programming to be not worth the effort.
I have several years of experience with shell scripting under Unix, but I found it enormously difficult to do much of anything with PowerShell.
It seems like many functions require you to interrogate the Windows Management Interface and issue SQL-like commands to get the information you need.
For example, I wanted to write a script to remove all files with a specific suffix from a directory tree. Under Unix, this would be a simple …
find . -name \*.xyz -exec rm {} \;
After a couple of hours dicking around with Scripting.FileSystemObject
and WScript.Shell
and issuing "SELECT * FROM Win32_ShortcutFile WHERE Drive = '" & drive & "' AND Path = '" & searchFolder & "'", I finally gave up and settled for Windows Explorer's Search command and just do it manually. There's probably some way to do what I wanted, but I didn't see anything obvious and all the examples on the MSDN site were so trivial as to be worthless.
EDIT Heh, of course as soon as I wrote this I poked around some more and found what I had been missing: the -recurse
option to the remove-item command is faulty (revealed if you use get-help remove-item -detailed
).
I had been trying "remove-item -filter '* .xyz' -recurse" and it wasn't working, so I gave up on it.
Turns out you need to use get-childitem -filter '*.xyz' -recurse | remove-item
- 在GitHub API上使用带有用户名和密码的Invoke-WebRequest进行基本authentication
- 在PowerShell中执行命令的执行
- 如何获取PowerShell脚本的文件系统位置?
- 从另一个powershell脚本加载variables
- 如何开始使用PowerShell?
- 使用Start-Process和WaitForExit而不是-Wait获取ExitCode
- 无法使用visual studio 2013debugging托pipe代码(“无法评估expression式”错误 – 我正在使用debugging版本)(请注意VS 2012的工作原理)
- PowerShell是否支持常量?
- 如何在PowerShell中计数对象?