我问,因为PowerShell让我感到困惑。
我一直在尝试使用PowerShell编写一些部署脚本,但我对结果并不感兴趣。我有一个喜欢PowerShell的同事并且每时每刻都在捍卫它。这位同事声称PowerShell从未被写成强大的外壳,而是写成:
a)允许您在命令行上查看和查看.NET程序集(为什么这是PowerShell存在的原因?)
b)托管在.NET应用程序中进行自动化,类似于KDE中的DCOP以及Gnome如何使用CORBA。
c)被视为“.NET脚本”而不是实际的shell(与b相关)。
我一直觉得Windows错过了一个很好的方法来敲出自动化脚本。在很多情况下cmd太简单了,而且WSH太过钝(尽管组合可以成功使用,但我不是粉丝)。当我第一次听说PowerShell时,我觉得Windows终于得到了一个能够帮助完成许多任务自动化的体面shell,但是最近的经历和我的同事告诉我。
要明确的是,我不会怀疑它是基于.NET建立的,还是它传递对象而不是文本(尽管我的Unix背景:]),而且我并不认为PowerShell是没用,但从我所看到的,它并没有解决我希望它能很好地解决的问题。一旦你走出.NET / Powershell世界,事情就会让你感觉很舒服。
所有这一切都解决了,MS通过创建PowerShell解决了什么问题,还是我怀疑是一个政治混蛋的孩子?我用Google搜索并没有找到任何足以回答我的内容,但引用的次数越多越好。
答案 0 :(得分:36)
PowerShell实际上是由几个部分构建的:一个成熟且可扩展的自动化平台和一个现代管理shell。
前者主要用于最近的Exchange和其他服务器产品的管理GUI。 GUI只是PowerShell的一个包装器,可以解决繁重的问题(有点像UNIX GUI程序,作为命令行程序的包装器)。
Jeffrey Snover(PowerShell发明人)elaborates a little关于如何创建PowerShell以及它应该解决的目标和问题。
在我看来,作为shell的PowerShell显然是作为cmd(易于查看)和Windows Script Host的替代品(Windows Script Host近年来没有得到太多关注,尽管它有类似的概念作为.NET回归当今[一个平台,使用ActiveScripting的多种语言],但是使用.NET,微软基本上把它放在休息状态,复活可能不是他们的选择。)
它将Windows管理的大多数方面统一为您只需学习一次的常见概念和方法。此外,PowerShell对我来说的强大之处在于它绕过对象,这可能解释了当你走出.NET / PowerShell世界时你遇到问题的原因,你只能从命令中获得String[]
。但是对于很多东西你可以在cmd中调用外部程序,有一个cmdlet会为你做这个。
答案 1 :(得分:10)
作为一名开发人员,我可以告诉你,我不再在一个文件夹中放置一堆ConsoleApplication42项目。
作为一家小公司的开发人员,我几乎做所有事情(DBA,操纵路由器,从交换机拉取呼叫详细记录,监控和为客户提供图形带宽等等)我可以告诉你PowerShell填补了Windows中急需的空白,并且当PowerShell管道太慢而无法处理数百万次迭代或需要更永久,强类型的实现时,它构建在.NET上提供了无缝升级路径。
无论如何,我想问题是如果你没有迫切的需要,为什么要切换到PowerShell?我的意思是现在学习它很好,因为它基本上是微软所有东西的新管理界面。但如果这不会影响到你,那么如果你认为自己没有任何收获,就不要理会。 p>
编辑(回应以下评论)
听起来你正在尝试使用.NET Process类来启动exe并重定向它的stdout,以便调用者可以读取它。我同意这是一个令人痛苦的.NET,但幸运的是,PowerShell非常简单地为你做了这一切。至于捕获结果并仍然将其写入显示器,虽然命令不是一个非常着名的命令,但它通常不常用,这也很简单。这是一个例子:
# I always find it easier to use aliases for external commands
Set-Alias csc C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe
# Create some source file
Set-Content test.cs @"
class Program {
static void Main() {
System.Console.WriteLine("Hello World");
}
}
"@
# Call CSC.EXE
# the output of csc.exe is written to results.txt and piped
# to the host (or select-string if you prefer)
csc test.cs | Tee-Object -file results.txt
# Check for errors
if ($LASTEXITCODE) {
# this is where community extensions would come in
# handy. powershell 2.0 also has a command to send
# mail but in 1.0 you can grab one from poshcode.org
}
答案 2 :(得分:1)
恕我直言,主要优势似乎是在命令控制台中进行合理的剪切和粘贴。
否则我在Windows上使用ActiveState的ActivePerl来编写脚本。它比任何Windows shell脚本都更强大,OLE界面以易于使用的方式公开整个Windows API。