我一直在阅读PowerShell是未来的道路。 在第一次发布的时候,我做了一大堆虚拟实验,但是从那以后我还没有在生产环境中使用它。 我知道,当我处理已经安装的操作系统的时候,就会有一天,所以我想做好准备。
我想知道:
似乎每个人都同意微软推动这一点,但没有人真正使用它。 我想从系统pipe理员那里听到使用它来做每天的任务和共享一些代码示例。
微软正在竭尽全力让PowerShell成为各地高级用户和自动化作家的select。 在.NET中编译代码的时代已经一去不复返了,现在你只需要notepad.exe和google。 我们在办公室里是它的粉丝,特别是因为Exchange 2007的pipe理控制台没有包含在PowerShell中可以做的所有事情。 微软故意没有实现那些在一段时间内只能完成一次的事情,更容易以这种方式进行开发,如果有类似复杂环境的东西,就会迫使它使用它。
pipe理微软的新一代产品(Win7,Windows Server 2008,Exchange 2007/2010,SQL Server 2008)都有非常丰富的PowerShell挂钩。 一旦远程Powershell(PowerShell 2.0 IIRC)与Server 2008 R2一起部署,对于自动化编写者来说,它将变得更加有用。
我们用它做了什么:
所以是的,PowerShell将会和我们在一起很长一段时间。
编辑 :添加一个代码示例,因为它被要求
$名单=import的CSV( “groupusers.csv”) $ lastseengroup = $列表[0]。集团 $ ADGroupPrefix = “grp.netware。” $ ADGroupSuffix =“{redacted - 格式为,ou = groups,dc = domain,dc = domain,dc = domain}” 清除variables成员列表 明确variables的未知用户 foreach(在$ list中input$){ if($($ entry.group)-ne $ lastseengroup){ 回声“绊倒新的组$($ entry.group),提交到$ lastseengroup” $新闻组= $ ADgroupPrefix + $ lastseengroup $ newgroupdn = ' “+ ”CN = $ $新闻组ADGroupSuffix“ +”“' 回声“获取DN为$ newgroup” $ existinggroup = dsquery group domainroot -name $ newgroup 如果(($ existinggroup -ne $ null)){ dsmod组$ newgroupdn -chmbr $ memberlist } else { dsadd组$ newgroupdn -scope u -secgrp yes -members $ memberlist -desc“从eDirectory导入的组” } 清除variables成员列表 } $ User = get-user $($ entry.member)-ErrorAction默默继续 如果($ User.isvalid){ $用户DN = $ User.distinguishedname $ memberlist = $ memberlist +'“'+”$ UserDN“+'”' } else { $ unknownusers = $ unknownusers + $($ entry.member) } $ lastseengroup = $($ entry.group) } dsadd group“cn = $ ADGroupPrefix $ lastseengroup $ ADGroupSuffix”-scope u -secgrp yes -members $ memberlist
这需要使用perl脚本创build的CSV文件并更新一组组。 如果该组已经存在,则将其replace为文件中指定的成员。 如果该组不存在,则创build它。 这是一个单向同步。 另外,还不完全在生产,但接近。
鉴于微软的服务器产品将从一开始就是PowerShell的(我相信下一个版本的Exchange 所有的configuration都可以通过PowerShell获得),像PowerShell in Practice这样的书籍描述了一些很好的方法来自动化单调的任务,我认为有理由认为PowerShell将在Windows服务器领域成为stream行的技术一段时间了。
我推荐Scott Hanselman的Podcast#162 。 似乎所有的Microsoft服务器团队都被迫“提供PowerShell cmdlet”,并且遵循一个一致的语法。
此外,像VMware这样的第三方正在采用它
简而言之,我认为从2.0开始的PowerShell严重地取代了所有batch file,而不是最重要的任务。
我用作SQL Server数据库pipe理员的十个PowerShell脚本(全部在我的博客中描述/张贴):
你使用什么样的pipe理任务?
应用程序/服务监视:从(远程)事件日志和存储过程中获取关键性能数字,并从单个batch file中显示它们
我是一名SQL Server DBA,请教我一些很酷的事情呢?
automssqlbackup :MSSQL的日常备份(每日=增量,每周+每月=满;每天保持5次,每周5次备份),压缩,电子邮件通知
在以前的职业生涯中使用了unix shell脚本,然后转到windows服务器pipe理,我可以说我真的很喜欢powershell – 我没有时间也没有能力学习太多的神秘语法,并且很惊喜,很多PowerShell脚本可以写得非常简单的语言…采取什么它的价值,因为我曾经用ksh!
我预测它会在很长一段时间。
我认为这很酷:在SQL Server 2008中,您可以获得新的PowerShell扩展,使您可以像本地文件系统或registry一样导航SQL数据库。
安装SQL Server客户端工具后,您可以在PowerShell中打开任何数据库(通过右键单击上下文菜单),并以面向对象的方式进行操作:
PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\ExampleDB\>function prompt {"PS >"} PS >cd tables PS >dir SCHEMA NAME CREATED ------ ---- ------- dbo MyTable 25/06/2009 17:02 PS > dir | format-table name, columns, rowcount, parent NAME COLUMNS ROWCOUNT PARENT ---- ------- -------- ------ MyTable {Id, Name} 0 {ExampleDB} PS >$myTable = dir | where {$_.Name -eq "MyTable"} PS >$myTable.Script() SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON CREATE TABLE [dbo].[MyTable]( [Id] [int] IDENTITY(1,1) NOT NULL [Name] [nText] NOT NULL ) ON [PRIMARY] PS >set-location \SQL\AnotherServer\Default PS >cd databases\Northwind\tables PS >$myTables = dir | where {$_.Rowcount -gt 100 -and $_.HasIndex -eq 1} PS >$myTables.Count 8 PS >foreach ($table in $tables) {$table.RebuildIndexes(90)}
注意第一行只是改变提示,以便它不那么长。
希望除此之外,这是不言而喻的:)
SQL Server 2008现在在Management Studio中有PowerShell上下文选项,所以Exchange不止于此。 另外,把它想象成DOS的替代品,因为这是MS所想的,因为它们不能提高DOS的安全性,因此它们只是创造了一些新的东西,解决了问题!
我也是一名DBA,很长时间的脚本,回到DOSbatch file,V3.3! 移动到VB脚本,但PS是非常强大的。 看看 – 对不起,我不能发布链接,因为我是一个新用户。 从Otto Helweg的博客得到这个。 这是一个便宜而愉快的软件清单工具。
示例PowerShell脚本:
# Open the database connection $dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi" $dbConn.Open() $sqlQuery = $dbConn.CreateCommand() # Get all known computers $sqlQuery.CommandText = "select * from Inventory..Computers" $reader = $sqlQuery.ExecuteReader() $computersToQuery = @() while ($reader.Read()) { $computersToQuery += $reader["Computer"] } # Close the database connection $dbConn.Close() $softwareInventory = @{} foreach ($computer in $computersToQuery) { $psinfoOutput = ./psinfo.exe -s Applications \\$computer $foundSoftwareInventory = 0 $computerName = "" foreach ($item in $psinfoOutput) { if ($foundSoftwareInventory -eq 1) { # Force the results to a string # Remove any single quotes which interfere with T-SQL statements # Load the result into a hash whereby removing any duplicates [string]$softwareInventory[$computerName][$item.Replace("'","")] = "" } if ($item -like "System information for *") { $computerName = $item.Split("\")[2].TrimEnd(":") } elseif ($item -eq "Applications:") { $foundSoftwareInventory = 1 $softwareInventory[$computerName] = @{} } } } $dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi" $dbConn.Open() $sqlQuery = $dbConn.CreateCommand() foreach ($computer in $softwareInventory.Keys) { foreach ($softwareItem in $softwareInventory[$computer].Keys) { "Loading-" + $computer + ":" + $softwareItem # Try an Update then an Insert trap { $sqlQuery.CommandText = "update Inventory..SoftwareInventory set AuditDate = getdate() where Computer = '" + $computer + "' and Software = '" + $softwareItem + "'" $result = $sqlQuery.ExecuteNonQuery() continue } $sqlQuery.CommandText = "insert into Inventory..SoftwareInventory (Computer,Software,AuditDate) values ('" + $computer + "','" + $softwareItem + "',getdate())" $result = $sqlQuery.ExecuteNonQuery() } } $dbConn.Close()
戴夫J
以下任务由我的团队在PowerShell上定期完成
我每天都有一个PS提示符,并将它用于任何我曾经使用CMD的任务。
以下是用于阅读Sharepoint列表的一些代码示例。 我使用了Sharepoint的Web服务和PowerShell V2.0中新的“New-WebServiceProxy”cmdlet
$url = "http://server/sites/site/_vti_bin/lists.asmx" $listWebService = new-webServiceProxy -uri $url -UseDefaultCredential $listName = "MyList" $viewGuid = $null $query= $null $viewFields = $null $numRowsReturned = 20000 $queryOptions = $null $result = $listWebService.GetListItems($listName,$ViewGuid,$query,$viewFields,$numRowsReturned,$queryOptions,$null)
Oisin Grehan 在使用Sharepoint Web Services方面有很好的博客文章 ,我用它来创build我所有的function。 他拥有一个非常棒的new-webservice.ps1脚本,如果您仍在使用PowerShell V1,则可以使用该脚本。
另外,下面是我用来获取群集中节点上的可用内存的基本函数
Function Get-AvailableMemory { param ( [string[]] $servers ) BEGIN { $query = "select AvailableBytes,__SERVER from Win32_PerfRawData_PerfOS_Memory" $availableMemory = @{ Name="AvailableMemory"; Expression = {[math]::round($_.AvailableBytes/1gb,2)} } $serverName = @{ Name ="Server"; Expression = {$_."__SERVER"} } } PROCESS { foreach ($server in $servers){ get-wmiobject -query $query -computer $server | select-object $availableMemory, $serverName } } END {} }
我在一个小型的项目中尝试过使用PowerShell,每天将大约600名用户和大约200个小组的子集从公司AD迁移到使用类似CSV文件的旧UNIX系统。 我被提供了一个500行的VBScript脚本(!),它以一个组和用户作为出发点。
原来,一个〜20行的PowerShell脚本可以完成整个事情…
作为* NIX用户(服务器和客户端),我对PowerShell感到非常惊喜。 即使你只知道一小部分命令,你也可以用它做很强大的工作。 我只需要SSH (类似)远程访问…
我怎么能不使用它? 所有出来/正在升级的Microsoft服务器应用程序现在都使用Powershell进行pipe理。 然后提供一些或多或less烦人的用户界面/pipe理控制台内置的这个核心往往是狗慢,有人指出,缺乏function,所以我不能说我们有很多select实际上^ ^
Powershell不是完美的,但如果你使用它,你知道这是非常酷的。 可以访问整个.net库和内置cmdlet(并在2.0中使用PS创build自己的cmdlet),这非常酷。
我认为唯一缺less的就是一个很好的IDE,我肯定有一天它会来自MS。 现在我使用Idera的powershell plus和adminscripteditor,它们允许debugging,而且非常酷。
我能够很好的摆脱VB的身份。
迄今为止我最大的项目是使用“powershellASP”来创build一个运行powershell命令的基本网页,并从我的十几台VMWare ESXi(免费)主机中提取VMware主机和虚拟机信息,并将它们显示在HTML表格中。 我这样做是因为使用免费的VMWare ESXi并没有虚拟中心,没有其他方法可以实时查看公司中所有虚拟机的情况。 PowershellASP是为IIS编写的免费第三方分析器,不受MS支持。 所以它现在可以做一些有限的事情,文档是相当稀疏的。
我有一大堆pipe理/库存脚本,它们通过ADsearch不同的东西,并通过WMI查询这些重要的统计信息,如服务器上的共享,磁盘空间,使用的磁盘空间等。
通用脚本:
用户脚本:
我有一个枚举ESX服务器上的所有VMWare客户机
我有一个脚本在x天后抓取文件并安全地删除它们。
基本上我可以做什么花了大约200行的VBScript,并在10 PowerShell中。 你也可以做你在VBScript中做不到的事情,比如发送带有附件的电子邮件 – 我经常给我发送脚本的结果。 您还可以使用自定义服务名称和事件ID将有意义且唯一的条目写入事件日志。
这就是我能想到的。 我select的工具是PowerShell,它只是让生活更轻松。
基本上,对于系统pipe理员而言,Bash脚本对于Unixpipe理员来说是非常有用的。
我正在看poweshell来replace我们的客户端批处理脚本 – 运行程序,login脚本等
但发现它至less增加了10秒钟的login时间 – 这就是所有的“调整”。 所以结束了与我们正在使用的东西。
不是一个.NET开发人员,我只能使用所有与PS相关的好东西。 但是,作为Exchangepipe理员(除其他外),Exchange 2007的PowerShell集成非常棒。 我终于有一个可靠的脚本引擎为我的邮件系统; 到目前为止,我已经发送给每个人每月的统计信息,根据一天中的时间调整分配给各个电子邮件地址的人员,自动创build和分配公共文件夹的权限,并在两个邮箱的DB之间对用户进行负载平衡。 从Ex07的angular度来看,另一件很酷的事情是,在GUI中执行任何操作之后,它会为您提供相关的PowerShell命令。 复制这些文件,你最终将拥有一套PS脚本,可以从头开始重新构build你的Exchange环境。
在我工作的地方通过服务器检查自动化某些事情(从WMI收集基本信息并从事件日志收集错误和警告)。
它处理的事件日志真棒。
我最近编写了一个脚本来禁用福昕阅读器默认启用的自动更新popup窗口。 它从AD中拉出一个电脑列表,然后testing看看它是否上升,然后它将1变成0。
有一件事我忘了!
你几乎可以完全访问.NET库。 用它做很复杂的东西是一件很痛苦的事情,但是如果你有这个需要的话,它就在你的身边。
我们将其用于相当多的pipe理任务,主要是微软的商店。 一些脚本很简单,比如清理旧文件或整理机器并logging结果。 一个脚本主要使用WMI审计计算机,并将结果logging在数据库中。 它获得硬件(CPU,RAM,驱动器等),networking信息,本地用户,安装的软件和configuration文件信息。 有一个调用Web服务来发送电子邮件。 我想在将来它会replace仍在使用的其他VBScript脚本。 我们还没有将它用于Exchange或SQL Server任务。
我期待下一个版本,它将支持后台作业,事务,更好的exception处理,新的ISE(集成脚本环境),更好的debugging等等。
我的Windowspipe理员还没有使用PowerShell。 他们都听说过,但他们没有花时间去熟悉它。
我决定自己看看。 来自Unix shell的背景,我认为Windows必须有一个真正的shell编程环境。 我认为微软在PowerShell和其他方面做得不是很好。
好的一面是它们使用对象作为PowerShell中的cmdlet之间的中介。 这为PowerShell带来了一定程度的权力,即基于文本的脚本必须破解才能工作。
消极的一面,他们确实没有充分利用Unix shell命令。 所以学习曲线是不必要的陡峭,并不能帮助人们轻松地从Unix移到PowerShell,反之亦然。 他们做的最多的是为一些PowerShell cmdlet定义别名,比如ls别名为Get-ChildItem ,所有的命令行开关都不相同。
只是我的两分钱…
这更像是一个开发人员的答案,但这是真实的世界,我们将在未来几个月的某个时候开始testing。 我开始学习PowerShell,以编写脚本将SQL Server任务带入我们的持续集成环境。 持续集成脚本将主要由NAnt和MSBuild通过JetBrains TeamCity运行 。
除此之外,我正在考虑将PowerShell作为我的主要Windows命令shell用于一般用途,尤其是对于SQL Server数据库pipe理任务。
对不起,我还没有任何代码示例尚未分享,因为我还在学习! 我会很高兴发布一些当我做,虽然:)
这里是一个单行代码示例,我刚刚回答你的另一个问题:)但是,嘿,维基…
这将列出安装的修补程序:
Get-ChildItem -Path “HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix”
虽然它并不是最简单的脚本语言(可靠的pipe道体验),并有自己独特的杠杆(给我一个简单的 sed -likey!!!),我发现PowerShell相当强大。 没有达到Bash或其他Unix shell的水平,但仍然。
我用它来监督一些数据库出口和import与电子邮件警告,以防事情变糟,并做一些例行的批量操作。
它当然已经是我的主要Windowsshell,但它不是真正的“less写更多”的东西。 PowerShell具有冗余(和.NETinheritance)。
PowerShell版本1.0在许多方面受到严格的限制,但是2.0版本很好。 与批处理脚本相比,function更强大。 我并不是真的把它当作一个shell,只是用于脚本,所以我的经验是相应地着色的。 我不太喜欢它的语法( -eq
vs ==
, -gt
>
vs >
等),但是如果我需要做一些奇怪的事情,我很欣赏能够下载到.NET中 。 我认为到3.0版本会很好。 现在我把它牢牢地放在“完成工作”的范畴。
我主要用它来自动部署代码。 这是一个用C#创build东西的地方。 与recursion目录复制等shell相关操作以及Bash脚本编写人员多年来一直认为的其他操作使事情变得如此简单。