我正在辩论是否应该学习PowerShell,还是只坚持使用Cygwin / Perl脚本/ Unix shell脚本等。
PowerShell的好处是可以使没有Cygwin的队友更容易使用脚本;但是,我不知道我是否真的会写那么多通用脚本,或者人们是否会使用它们。
Unix脚本是如此强大,PowerShell是否足够接近以保证可以切换?
以下是一些我将在PowerShell中寻找的特定内容(或等效内容):
我正在辩论是否应该学习PowerShell,还是只坚持使用Cygwin / Perl脚本/ Unix shell脚本等。
PowerShell的好处是可以使没有Cygwin的队友更容易使用脚本;但是,我不知道我是否真的会写那么多通用脚本,或者人们是否会使用它们。
Unix脚本是如此强大,PowerShell是否足够接近以保证可以切换?
以下是一些我将在PowerShell中寻找的特定内容(或等效内容):
Answers:
工具只是工具。
他们有帮助或没有。
您需要帮助或不需要。
如果您知道Unix,并且那些工具在Windows上可以完成您需要的工作-那么您就是一个快乐的人,无需学习PowerShell(除非您想探索)。
我最初的意图是在Windows中包含一组Unix工具并加以使用(我们团队中的许多人都具有深厚的Unix背景,并对这个社区怀有健康的敬意。)
我发现这并没有太大帮助。原因是AWK / grep / sed对COM,WMI,ADSI,注册表,证书存储等无效。
换句话说,UNIX是围绕文本文件自调整的整个生态系统。因此,文本处理工具是有效的管理工具。Windows是一个完全不同的生态系统,可围绕API和对象进行自我调整。这就是我们发明PowerShell的原因。
我认为您会发现,在很多情况下,文本处理都无法在Windows上满足您的需求。届时,您将需要使用PowerShell。注意-这不是一个全有或全无的交易。在PowerShell中,您可以调出Unix工具(并使用其文本过程或PowerShell的文本处理)。您也可以从Unix工具调用PowerShell并获取文本。
再说一次-这里没有宗教信仰-我们的重点是为您提供成功所需的工具。这就是为什么我们如此热衷于反馈。让我们知道我们在工作上遇到的困难或您没有需要的工具,我们会将其放在清单上并加以使用。
老实说,我们正在挖掘自己脱离30年的漏洞,因此需要一段时间。也就是说,如果您选择了 Windows Server 2008 / R2的beta和/或我们的服务器产品的beta,我想您会以为这一漏洞被迅速填补而感到震惊。
关于使用率-迄今为止,我们的下载量已超过350万。这不包括Windows Server 2008中使用它的人员,因为它是作为可选组件提供的,不需要下载。
V2将在所有版本的Windows中提供。对于所有版本,默认情况下它将是默认状态,除了Server core是可选组件之外。Windows 7 / Windows Server 2008 R2发行后不久,我们将在Windows XP及更高版本的所有平台上提供V2。换句话说-您在学习上的投资将适用于非常多的机器/环境。
最后的评论。如果/当您开始学习PowerShell时,我认为您会很高兴。许多设计在很大程度上受我们的Unix背景的影响,因此尽管我们有很大的不同,但是您会很快选择它(在您确定它不是Unix :-)之后)。
我们知道人们的学习预算非常有限-这就是为什么我们对一致性非常坚决。您将学习一些东西,然后将一遍又一遍地使用它。
实验!请享用!从事!
tar -c . | gzip > package.tar.gz
直接在PowerShell中那样做,否则会很痛苦。见brianreiter.org/2010/01/29/...
grep
Select-String
cmdlet和-match
运算符可使用正则表达式。您也可以直接使用.NET的正则表达式支持来获得更多高级功能。
分类
Sort-Object
比我记得* nix的功能更强大sort
。允许对任意表达式进行多级排序。在这里,PowerShell对基础类型的维护会有所帮助;例如,DateTime
属性将被排序为,DateTime
而不必确保将其格式化为可排序的格式。
优衣库
Select-Object -Unique
Perl(PowerShell与Perl功能之间的距离如何?)
就Perl特定领域支持库的广度而言:还远远没有(到目前为止)。
对于常规编程,PowerShell当然具有更强的凝聚力和一致性,并且更易于扩展。文字修饰的一个空白等同于Perl的..
运算符。
AWK
自从使用AWK以来已经足够长了(必须大于18年,因为以后我才使用Perl),所以不能发表评论。
sed
[往上看]
文件(提供文件信息的命令)
在这里,PowerShell的优势与其对文件系统对象所做的事情无关(它可以在此处获取完整的信息,适当的dir
返回FileInfo
或FolderInfo
对象)是整个提供程序模型。
您可以将注册表,证书存储,SQL Server,Internet Explorer的RSS缓存等视为可通过与文件系统相同的cmdlet导航的对象空间。
PowerShell绝对是Windows上的前进之路。Microsoft已将其作为对未来非家用产品的要求的一部分。因此在Exchange中有丰富的支持,在SQL Server中也有支持。这只会扩大。
最近的一个例子是TFS PowerToys。完成许多TFS客户端操作而不必每次都启动tf.exe(这需要新的TFS服务器连接,等等),并且明显易于随后进一步处理数据。以及允许对整个TFS客户端API进行更广泛的访问,而不是在TF.exe的任何团队资源管理器中公开。
sed 's/pattern/replacement/' file
,大约gc file | %{$_ -replace 'pattern','replacement'}
与awk类似:awk 'BEGIN {} /pat1/ {action1} /pat2/ {action2} END {}' file
大约{BEGIN {}; switch -r -c -file file { 'pat1' {action1} 'pat2' {action2}}; END{};}
作为一个从1997年至2010年专注于Windows企业开发的人,基于先前给出的所有充分理由,显而易见的答案将是PowerShell(例如,它是Microsoft企业战略的一部分;它与Windows / COM / .NET很好地集成;以及使用对象而不是文件提供了“更丰富”的编码模型)。因此,在过去的两年左右的时间里,我一直在使用和推广PowerShell,显然我遵循的是“条例草案”。
但是,作为实用主义者,我不再确定PowerShell是一个很好的答案。尽管它是出色的Windows工具,并且为填补Windows命令行这一历史性漏洞提供了急需的步骤,但是当我们所有人都看到Microsoft掌握了消费者计算能力时,微软似乎仍在为保持其操作系统的地位而进行巨大的战斗对未来的企业很重要。
确实,鉴于我发现自己的工作越来越在异构环境中进行,因此我发现现在使用Bash脚本更为有用,因为它们不仅可以在Linux,Solaris和Mac OS X上运行,而且还可以与Bash脚本一起使用。 Cygwin的帮助-在Windows上。
因此,如果您相信操作系统的未来是商品化的而不是垄断的,那么选择敏捷的开发工具策略似乎是合理的,在可行的情况下,该策略应远离专有工具。但是,如果您看到自己的未来被Redmond主导,那么请使用PowerShell。
我使用了一些PowerShell进行脚本自动化。尽管对环境的思考似乎比Unix shell要好得多,但实际上使用对象而不是文本流要笨拙得多,并且在最近30年中开发了许多Unix工具。几年仍然失踪。
Cygwin仍然是Windows主机的首选脚本环境。在完成工作方面,它无疑比其他选择更好。
这里有很多很棒的好答案,这是我的看法。如果您愿意,PowerShell已准备就绪...示例:
grep =“ 选择字符串-模式 ”
sort = “排序对象”
uniq =“ Get-Unique ”
file =“ 获取项目 ”
cat =“ 获取内容 ”
Perl / AWK / Sed不是命令,但是实用程序因此很难比较,但是您几乎可以在PowerShell中执行所有操作。
sls
,sort
,gu
,gi
,gc
分别。易读的长名称,用制表符补全,而短的可键入名称在一个系统中。这对您来说是用户友好的进步。
Get-Content
是cat
,因此对于这一别名,Cygwin / Unix和PowerShell之间没有任何区别。不幸的是,在大多数情况下,Microsoft的cmdlet文档缺少有关别名的信息,但是在PowerShell会话中使用会输出所有别名的列表Get-Alias
。“ Get-Unique”的别名是“ gu”,因此比Cygwin / Unix的别名短!
我只是最近才开始认真地尝试一下PowerShell。尽管在过去的七年中,我一直在几乎完全基于Windows的环境中工作,但我来自Unix背景,发现自己一直在努力尝试“ Unix-fy”我在Windows上的交互经验。至少可以说令人沮丧。
将PowerShell与Bash,tcsh或zsh之类的东西进行比较是公平的,因为grep,sed,awk等工具会找到严格来讲,等不是Shell的一部分。但是,它们将始终是任何Unix环境的一部分。也就是说,像一个PowerShell命令选择字符串有一个非常类似的功能的grep和为捆绑在PowerShell的核心模块...这样的线可有点模糊。
我认为关键是文化,各个工具集将体现各自的文化这一事实:
Unix管理界面(以及多年来的开发界面)传统上一直是命令行和虚拟终端。Windows从GUI开始,而管理功能直到最近才开始逐渐消失完全基于GUI的功能。考虑到它在PowerShell上的重要地位,我们可以期望命令行上的Unix经验会更丰富,更成熟,而我的经验与此相匹配。就此,以我的经验:
Unix管理经验旨在通过最少的按键操作使事情变得容易。这可能是由于必须通过缓慢的9600波特拨号连接来管理服务器的历史情况的结果。现在,PowerShell确实具有别名,这对于解决相当冗长的内容有很大帮助 Verb-Noun标准,但是要知道这些别名有点麻烦(任何人都知道比: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控制台中进行最简单的导航,而不必离开原位,这会给您带来麻烦。
至少在系统API方面,Windows文化在很大程度上由支持框架(即COM和.NET)驱动,这两种框架都是高度结构化且基于对象的。另一方面,对Unix API的访问传统上是通过文件接口(/dev
和/proc
)或(非面向对象的)C风格的库调用来进行的。因此,脚本编写经验与各自的OS范例相匹配就不足为奇了。PowerShell本质上是结构化的(一切都是对象),并且基于Bash和朋友文件。PowerShell程序员可以使用的结构化API庞大(基本上与现有的标准COM和.NET接口集合的庞大匹配)。
简而言之,尽管可以说PowerShell的脚本功能比Bash强大(特别是当您考虑.NET BCL的可用性时),但交互式体验却明显较弱,特别是如果您是完全由键盘驱动的,基于控制台的观点(与许多Unix头一样)。
alias -Definition *property
(或任何其他模式)怎么样?我认为答案的问题在于,您正在将外壳程序和控制台进行混合:请记住,您可以选择具有不同编辑选项的控制台。他们故意破坏了DOS控制台的编辑,以鼓励人们使用其他控制台,例如ISE。
!!
示例可以用Powershell编写,(h -c 1) -replace '-1-','-2-' -replace '50','51' | iex
但是使用向上箭头和单个命令进行编辑更容易。如果您想通过许多命令来执行此操作,我认为Powershell将会胜出。要重复10条以命令#255结尾的命令并进行编辑(h -c 10 -id 255) -replace '-1-','-2-' -replace '50','51' | iex
,请执行以下操作:此外,Powershell的历史记录使您可以做Linux外壳中闻所未闻的事情。如果您回顾性地想知道命令要花多长时间:h -id 20 | select { $_.EndExecutionTime - $_.StartExecutionTime }
fc -e "sed -i -e 's/-1-/-2-/g' -e 's/50/51/g'" 10 255
无论如何,我都不是一位经验丰富的PowerShell用户,但是我接触到的那一点点给我留下了深刻的印象。您可以将内置的cmdlet链接在一起,以完成在Unix提示符下可以执行的几乎所有操作,并且还有其他好处,例如可以导出到CSV,HTML表以及进行更深入的系统管理类型的工作。
如果确实需要sed之类的东西,那么总会有UnixUtils或GnuWin32,您可以很轻松地将它们与PowerShell集成。
作为一个长期的Unix用户,我习惯了命令命名方案确实遇到了一些麻烦,如果我对.NET有了更多的了解,我当然会从中受益匪浅。
因此,从本质上讲,如果Windows的唯一性没有问题,那么我值得学习。
如果您喜欢Shell脚本,您将爱上PowerShell!
从Microsoft Command Shell(Ars Technica)的导览开始。
'
(单引号)。对于双引号-相同,请使用write-output 'this is a "test"'
。您要指向的问题是正则表达式,而正则表达式的转义在任何地方都有效。Powershell也具有Here-Strings或逐字字符串。甚至Java也没有这些!尝试在Java中转义正则表达式。而且有时您不使用文字路径。在需要时使用。LiteralPath逐字对待通配符,并且不对其进行扩展。您可以在文件拥有它时使用它。它给您更多选择。
write-output "this is a `"test`""
有效。只需使用`
代替“ \”即可。regex :: escape可以为您提供帮助,以免您错过转义的内容。没有必要使用它。您认为存在可以帮助您并防止错误的其他选项是不一致的。
随着我最近的实验使我深入了解PowerShell和.NET调用,我必须说PowerShell 可以代替Cygwin和Unix shell。
我不确定Perl,但是由于PowerShell和Perl都已经完成了图灵编程语言的开发,因此我也同意取代Perl。
PowerShell在Cygwin和* nix下的普通Bash之上具有的一件事是它具有执行沙盒DLL调用,通过直接API调用,WMI方法甚至COM对象操纵操作系统的能力。如何通过代码启动Internet Explorer,然后对其显示的文档进行任何操作,有效地模拟Web服务器的后端?
如何从SQL Server和其他数据提供程序收集数据,进行解析并将其导出为CSV,邮件,文本以及实际上任何现有和不存在的文件格式?(当然,具有从接收到的数据中创建有效文件的适当技能,但是CSV随时可用)。
而且,通过签名的cmdlet和脚本,组策略以及执行策略可以提供额外的安全性,即使您以管理员身份运行恶意代码,也可以防止恶意代码在您的系统上运行。
关于实施了哪些命令-理查德的答案列出了它们以及PowerShell已模拟它们功能的功能。
关于PowerShell是否强大到可以进行切换的问题-这是个人喜好问题,尽管随着越来越多的Windows服务提供PowerShell cmdlet来控制它们,但不将PowerShell与这些服务结合使用被认为是一个障碍。(Hyper-V服务器是主要的此类服务,它还提供了使用PowerShell cmdlet进行处理而不是使用GUI进行处理的功能!)
答案可能是迟到了五年,但是,如果有人在Windows上执行管理任务或对各种内容进行通用脚本编写,则他们绝对应该尝试利用PowerShell实现其目的。
将PowerShell与Cygwin / Perl / Shell组合进行比较时,请注意PowerShell仅代表该组合的“ Shell”部分。
但是,您可以像从cmd.exe或Cygwin中一样从PowerShell调用任何命令。它不重新实现特定的功能,它肯定是无法媲美的Perl。
它只是一个外壳,但是它使编程变得更容易,从而为.NET Universe提供了舒适的界面。
另外请记住,PowerShell需要Windows XP,Windows Server 2003或更高版本,根据您的IT基础架构,这可能会引起问题。
更新:
我不知道我的回答会引发什么样的哲学辩论。
我针对以下问题发布了答案:将PowerShell与Cygwin,Perl和Bash进行比较。
PowerShell是一个外壳程序,因为它在内置命令,小命令,用户功能和外部命令(.exe,.bat,.cmd)之间没有语法差异。只有调用.NET方法的不同之处在于,在调用中添加了名称空间或对象。
它的可编程性来自.NET框架,而不是特定于PowerShell“语言”的任何内容。
我会说,只要Bugzilla或MediaWiki,我相信PowerShell是一种“脚本语言”实施为在Web服务器上运行的PowerShell脚本,;)
在此之前,请享受比较。
PowerShell中的cmdlet非常好,运行可靠。自从我是Java / C#开发人员以来,他们的面向对象吸引了我很多,但这还不是完整的。由于它是面向对象的,因此它在POSIX工具集的许多文本流成熟度(awk
和sed
仅举几例)。
对于使用OO技术和使用POSIX工具中的成熟度这一难题,我找到了最好的答案!PowerShell的一个重要方面是,它在将对象传递到标准流方面做得很好。默认情况下,PowerShell使用对象管道来传输其对象。这些不是标准流(标准输出,标准错误和标准输入)。当PowerShell需要将输出传递给没有对象管道的标准进程时,它将首先将对象转换为文本流。由于它做得很好,因此PowerShell是托管POSIX工具的绝佳场所!
最好的POSIX工具集是GnuWin32。安装过程确实需要5秒钟以上的时间,但这值得您麻烦,据我所知,c:\windows\*
除了将文件复制到您指定的目录外,它不会修改您的系统(注册表,文件夹等)。这特别好,因为如果将工具放在共享目录中,则许多人可以同时访问它们。
下载并执行exe(它来自SourceForge网站),将其指向合适的目录(我将使用C:\bin
)。它将创建一个GetGnuWin32
目录,您可以在其中运行download.bat
,然后install.bat
(不带参数),之后,该C:\bin\GetGnuWin32\gnuwin32\bin
目录将是Windows计算机上曾经存在的最有用的文件夹。将该目录添加到您的路径,就可以开始了。
TL; DR-我不讨厌Windows或PowerShell。我只是无法在Windows或PowerShell上执行任何操作。
我个人仍然觉得PowerShell充其量是最好的。
~/
的一些短@environment://somejibberish/%user_home%
NTFS仍然是一团糟,而且似乎总是如此。祝你好运。
cmd-esque界面,恐龙cmd.exe在PowerShell中仍然可见,编辑 → 标记仍然是复制信息的唯一方法,并且仅以可见终端空间的矩形块形式复制。和编辑 → 标记仍然是将字符串粘贴到终端的唯一方法。
将其涂成蓝色不会使其更具吸引力。我不介意Microsoft开发人员对颜色有所了解。
Windows总是在屏幕的左上角打开。对于使用垂直任务栏的人来说,这非常令人讨厌,尤其是考虑到Windows任务栏将覆盖窗口的唯一一角,从而可以访问复制/粘贴功能。
对于Windows包含的工具,我不能说太多。拥有一整套开放源代码,免费许可的CLI工具,而就我所知,PowerShell附带了这些工具,这些都不是完全令人失望的。
wget
GNU wget看似无与伦比的参数。谢谢,一线希望的希望毫无用处。&&
是不处理运算符,这使得遵循以下条件的命令最简单我不认识男人 我试了一下,我确实做到了。我仍然尝试尝试一下,希望下次打开它时,它会越来越有用。我无法在PowerShell中执行任何操作,而且我几乎无法在一个实际项目中将GNU工具引入Windows。
MySysGit使用几个GNU工具为我提供了恐龙cmd.exe提示符,但仍然很让人难以理解,但最后完成了工作。Git命令将在Git Bash中运行。
Mintty for MySysGit在mysysgit的环境上提供了Cygwin界面,使对象可以复制和粘贴(选择复制(鼠标),Shift+ Ins粘贴,多么现代...)。但是,诸如此类git push
的东西在Mintty中是坏的。
我并不是要之以鼻,但即使使用Cygwin之类的工具,我仍然看到Windows上的命令行可用性存在巨大问题。
PS:仅仅因为可以在PowerShell中完成某些事情,就不能使它变得可用。可用性比能力更深,这是我尝试将产品用作消费者时倾向于关注的重点。
.
或[
访问属性或索引,因此不能仅在末尾添加路径分隔符。究竟是哪个PowerShell wget?哪个PowerShell POSIX?它不是在尝试将gnu工具引入Windows,也不是要与bash兼容。
(get-command wg*.exe).Path
。回复:bash完成和readline-> leeholmes.com/blog/2012/09/13/…导致github.com/lzybkr/PSReadLine
为什么不同时使用两者?像其他任何解释性脚本(如Perl等)一样,在Cygwin中调用PowerShell脚本。
我做了足够的工作,以至于写了一个https://bitbucket.org/jbianchi/powershell作为Bash包装器,以在Cygwin中调用powershell.exe。它可以用来作为认领的powershell.exe的.ps1脚本的第一行(因为PowerShell还使用“#”作为注释)。有关示例,请参见https://bitbucket.org/jbianchi/powershell/wiki/Home
我发现PowerShell编程不值得付出努力。
我在Unix下使用Shell脚本已有数年的经验,但是我发现使用PowerShell要做很多事情非常困难。
似乎许多功能都要求您询问Windows管理界面并发出类似SQL的命令来获取所需的信息。
例如,我想编写一个脚本来从目录树中删除所有带有特定后缀的文件。 在Unix下,这将是一个简单的...
find . -name \*.xyz -exec rm {} \;
经过几个小时的讨论Scripting.FileSystemObject
,WScript.Shell
然后发出“ SELECT * FROM Win32_ShortcutFile WHERE Drive ='“&drive&”'AND Path ='“&searchFolder&”'“,我终于放弃了,并选择了Windows资源管理器的Search命令和只需手动操作即可。可能有一些方法可以实现我想要的功能,但是我看不到任何明显的东西,MSDN站点上的所有示例都很琐碎,以至于一文不值。
编辑呵呵,当然,当我写这篇文章时,我四处摸索,发现我所缺少的东西:-recurse
remove-item命令的选项有问题(如果使用,则显示出来get-help remove-item -detailed
)。
我一直在尝试“ remove-item -filter'* .xyz'-recurse”,但是它没有用,所以我放弃了。
原来你需要使用 get-childitem -filter '*.xyz' -recurse | remove-item
您也可以尝试在Windows上使用BashWin在Windows上运行Bash脚本,网址为 https://github.com/skanga/BashWin。
PowerShell非常强大,比Unix Shell的标准内置功能更强大(但这仅是因为它包括通常炮轰给子程序的许多功能)。另外,请考虑您可以用任何.NET语言编写小程序,包括IronPython,IronRuby,PerlNet等。或者您可以直接从PowerShell调用Cygwin命令,而忽略所有其他功能,并且其工作方式类似于Bash,KornShell,管他呢...