列出唯一文件扩展的代码
- PS C:\Users\Administrator> Get-childitem | group-object extension | select-object name
- Name
- ----
- .VirtualBox
- .txt
- .ps1
- .pl
- .RND
Get-ChildItem
我把结果输出到1.txt里面
- PS C:\Users\Administrator>Get-childitem >> 1.txt
- 目录: C:\Users\Administrator
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- d---- 2012/11/13 15:24 .VirtualBox
- d-r-- 2012/10/18 16:50 Contacts
- d-r-- 2012/11/13 16:07 Desktop
- d-r-- 2012/11/5 10:07 Documents
- d-r-- 2012/11/13 16:48 Downloads
- d-r-- 2012/10/18 16:53 Favorites
- d-r-- 2012/10/18 16:50 Links
- d-r-- 2012/10/18 16:50 Music
- d-r-- 2012/10/30 17:08 Pictures
- d-r-- 2012/10/18 16:50 Saved Games
- d-r-- 2012/10/18 16:50 Searches
- d---- 2012/10/30 13:33 SysinternalsSuite
- d-r-- 2012/10/18 16:50 Videos
- d---- 2012/11/12 16:03 VirtualBox VMs
- d-r-- 2012/3/23 11:37 「开始」菜单
- d---- 2012/10/18 16:27 桌面
- -a--- 2012/11/14 9:14 4438 1.txt
- -a--- 2012/11/6 14:36 177 gespse.ps1
- -a--- 2012/11/5 11:14 909 new2.pl
- -a--- 2012/11/5 11:13 392 new3.pl
- -a--- 2012/11/9 8:51 600 PUTTY.RND
- -a--- 2012/11/2 10:47 0 rocks.txt.txt
Get-ChildItem是一个内置的cmdlet,列出给定路径里的文件和文件夹。
Group-Object这个命令可以收集对象,并通过特性进行分类,
可以用Get-Help Group-Object查看详细解释,用Get-Help Group-Object -examples查看详细的例子。
Select-Object这个命令允许你调出你想保存的对象。
PowerShell的函数参数
PowerShell中最大的特点之一是函数的可扩展性强。
位置参数
PowerShell可以创建一个数值数组传递给函数的$args变量。传递给函数的每一个值从0开始被添加到这个数组中。例如:
- function foo
- {
- Write-Host $args[0] $args[1]
- }
- foo "This is parameter 1""This is parameter 2"
- PS C:\Users\Administrator> C:\Users\Administrator\ps.ps1
- This is parameter 1"This is parameter 2
名字参数
PowerShell输入的参数也可以命名,这就意味着它们可以通过名字传递,并且值被放置在相应的变量里。注意,当这个函数被调用的时候,参数颠倒,但是数值能正确返回。
- function foo
- {
- Param($param1,$param2)
- Write-Host $param1 $param2
- }
- foo -param2 "this is parameter 2" -param1 "this is parameter 1"
结果:
- PS C:\Users\Administrator> C:\Users\Administrator\ps.ps1
- this is parameter 1 this is parameter 2
splatting参数
在PowerShell的参数传递中,这个或许是最常用的方法。它包含创建一个数组或哈希表作为传递给函数的参数组。这个让你可以动态的创建整个脚本的参数,然后当你准备好后即可调用。
- function foo
- {
- Param($param1,$param2)
- Write-Host $param1 $param2
- }
- Create Hash Table
- $Blah=@{"Param1"="this is parameter 1";
- "Param2"="this is parameter 2"}
- #pass hasj table to function
- foo @Blsh
结果出错了
- PS C:\Users\Administrator> C:\Users\Administrator\ps.ps1
- 无法将“Create”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后重试。
- 所在位置 C:\Users\Administrator\ps.ps1:7 字符: 9
- + Create <<<< Hash Table
- + CategoryInfo : ObjectNotFound: (Create:String) [], CommandNotFoundException
- + FullyQualifiedErrorId : CommandNotFoundException
PowerShell参数的属性
Mandatory 这个属性在powershell参数选项里是默认的,但是如果你知道你需要的参数类型,你可以使用这个属性来强制用户传递这种类型的参数。如果它们没有这样做,powershell将报错给它们,并且强迫的它们提供这种类型的值,以便函数能够正常的运行。
- function foo
- {
- Param(
- [Parameter(Mandatory=$True)]
- $param1
- )
- Write-Host $param1
- }
ParameterSetName 我们常常需要一起传递一组参数(通常因为一些意外所中断)。例如,你有一个函数要获得一个活动目录对象,如果它是一个用户或是一个计算机,你就需要知道账户:
- function Get-ADObject
- {
- Param(
- [Parameter(Mandatory=$True,
- ParameterSetName="User")]
- $User,
- [Parameter(Mandatory=$True,
- ParameterSetName="Computer")]
- $Computer
- )
- $PScmdlet.ParameterSetName
- }
- # Get-ADObject -#this will throw an error because no parameters passed
- Get-ADObject -user "joe" #will return 'user'
- Get-ADObject -Computer "joe" #will return 'computer'
- # Get-ADObject -User "joe" -Computer "joe" #will return an error
ValueFromPipeline 这个属性告诉函数某个特定的参数值可以通过管道来传递参数。
- function Get-ADUserObject
- {
- Param(
- [Parameter(ValueFormPipeline=$true)]
- $User,
- )
- Process
- {
- $user
- }
- }
- $ListofUsers | Get-ADUserObject
这个运行有问题
ValueFromPipeLineByPropertyName 这个属性不是使用类型,它使用的是传入对象的属性名称。例如,如果你有一个叫做UserName的用户对象属性。
- function Get-ADUserObject
- {
- Param(
- [Parameter(ValueFromPipelineByPropertyName=$true)]
- $Username,
- )
- Process
- {
- $UserName
- }
- }
- $ListofUserObjects | Get-ADUserObject
跟前面那个错误差不多
- PS C:\Users\Administrator> C:\Users\Administrator\ps.ps1
- “,”后缺少表达式。
- 所在位置 C:\Users\Administrator\ps.ps1:5 字符: 17
- + $Username, <<<<
- + CategoryInfo : ParserError: (,:OperatorToken) [], ParentContainsErrorRecordException
- + FullyQualifiedErrorId : MissingExpressionAfterToken
HelpMessage 这允许你给用户添加一个帮助信息。如果它们没有指定mandatory属性来调用你的函数,这可以给它们解释需要输入用户名:
- function Get-ADComputerObject
- {
- Param(
- [Parameter(Mandatory=$True,HelpMessage= "Enter computer name.")]
- $ComputerName,
- )
- $ComputerName
- }
原文http://searchsv.techtarget.com.cn/showcontent_39722.htm?lg=t
Windows PowerShell五大Cmdlet命令
Function--- 与cmdlet非常类似,除了他们是使用关键工作“功能”产生的意外。
例如function foo {"I'm Foo"}
Parameter--- cmdlet或function的值。
Object ---从cmdlet或function返回的条目。对象拥有的属性和行为,。。。
Propertie---描述对象用到的属性。
Method---对象执行的动作。
Variable---用于存储数据的对象。
Pipeline---这个指从一个命令传输对象到另一个概念,通过管道操作符来完成。
Aliase---给用户提供缩写cmdlet的能力。
ScriptBlock---包含在"{"and"}"里的一块代码。
例如:{Write-Host "This is a ScriptBlock"}
现在我们来分解重要的cmdlet。括号里面的字符表示每个cmdlet的缩写。
Get-Help(help:)---有三个参数,控制返回数据的数量:Detail,Full,Example
语句:Get-Help
例子:Get-Help Get-Member
Get-Member(gm:)---它允许你发现给定对象拥有的属性和行为。毕竟,如果不知道属性在哪,你不能准确适用。
语句:<object> | get-member
例子: Get-Childitem | Get-Member
Get-Command(gcm:)---Get-Command仅仅提供命令。这些命令可以是cmdlet,funciton,aliase,application。
语句:Get-Command -commandtype <type>
例子:Get-Command -commandtype cmdlet
Foreach-Object(%:)---这个条目用于处理管道里的条目。对于管道里的每个对象,这个命令将处理脚本
语句:<object(s)> | foreach-object <scriptblock>
例子:Get-ChildItem | foreach-object {Write-Host "Found: "$-.fullname}
- PS C:\Users\Administrator> get-help write-host
- 名称
- Write-Host
- 摘要
- 将自定义的输出内容写入主机。
Where-Object(?:)---这个类似于Foreach-Object,但它不是简单处理脚本块,而是将脚本块作为某种过滤器使用。如果脚本块的结果是$true,对象可以传输。如果结果是$false,当前脚本将被丢弃。
语句:<object(s)> | where-object <scriptblock>
例子:Get-ChildItem | where-object {$_.Length -gt 10mb}
管理员常用的25个powershell命令
入门级别
1、像文件系统那样操作Windows Registry---cd hkcu:
2、在文件里递归的搜索某个字符串---dir -r | select string "searchforthis"
3、使用内存找到五个进程---ps | sort -p ws | select -last 5
4、循环(停止,然后重启)一个服务,如DHCP---Restart-Service DHCP
5、在文件夹里列出所有条目---Get-ChildItem -Force
6、递归-系列的目录或文件夹---Get-ChildItem -Force c:\directory -Recurse
7、在目录里移除所有文件而不需要单个移除---Remove-Item c:\tobedeleted -Recurse
8、重启当前计算机---(Get-WinObject -Class Win32_OperatingSystem -ComputerName .).Win32Shutdown(2)
收集信息
9、获取计算机组成或模型信息---Get-WmiObject -Class Win32_ComputerSystem
10、获取当前计算机BIOS信息---Get-WmiObject -Class Win32_BIOS -ComputerName.
11、列出所安装的修复程序(如QFE或Windows Update文件)---Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName.
12、获取当前登录计算机的用户的用户名---Get-WmiObject -Class Win32_ComputerSystem -Property UserName -ComputerName.
13、获取当前计算机所安装的应用程序的名字---Get-WmiObject -Class Win32_Product -ComputerName . | Format-Wide -Column 1
14、获取分配给当前计算机的IP地址---Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnable=TRUE -ComputerName . | Format-Table -Property IPAddress
15、获取当前计算机详细的IP配置报道---Get-WmiObject -Class Win32_NetworkadapterConfiguration -Filter IPEnable=TRUE -ComputerName . | Select-Object -Property [a-z]* -ExcludeProperty IPX*,WINS*
16、找到当前计算机上使用DHCP启用的网卡---Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=true" -ComputerName .
17、在当前计算机上所有的网卡上启用DHCP---Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName. | ForEach-Object -Process {$_.EnableDHCE()}
软件管理
18、在远程计算机上安装MSI包---(Get-WMIObject -ComputerName TARGETMACHINE -list | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\MACHINEWHEREMSIRESIDES\path\package.msi)
19、使用基于MSI的应用程序升级包升级所安装的应用程序---(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='name_of_app_to_be_updated'").Upgrade(\\MACHINEWHEREMSIRESIDES\path\upgrade_package.msi)
20、从当前计算机移除MSI包---(Get-WmiObject -Class Win32_Product -Filter "Name='product_to_remove'" -ComputerName.).Unistall()
机器管理
21、一分钟后远程关闭另一台计算机---Start-Sleep 60;Restart-Computer -Force -ComputerName TARGETMACHINE
22、添加打印机---(New-Object -ComObject WScript.Network.AddWindowsPrinterConnection(\\printerserver\hpaser3)
25、移除打印机---(New-Object -ComObject WScript.Network).RemovePrintConnection("\\printerserver\hplaser3")
24、进入powershell回话---invoke-command -computername machine1,machine2 -filepath c:\script\script.ps1