首先关于运行:
在shell里面运行一个脚本的话,你需要set-executinopolicy设为RemoteSigned。运行一个脚本在shell里面打脚本名即可。
如果是在run里面,就要打powershell-file"路径和脚本文件名",如果你要看到输出信息,那么可以加上-noexit选项。
如果是在schedule里面计划运行,那么和run差不多,在startaprogram之后,打入你在run里面会用的命令行,即可。
基本语法:
保留字:breakcontinuedoelseelseiffilterforforeachfunctionifinlocalprivatereturnswitchuntilwherewhile
数组:定义方法$name="string1","string2","string3"或者[email protected](1,2,3,4,5)
引用时$name[n]下标从0开始。$name.Count是数组大小
数组可以相加$num1+$num2就是简单的两个数组拼接。
数组的长度:$num.length
也可以定义键-值对的数组,叫做associativearray。
读取输入
$var=Read-Host"question?"var是变量名,引号里是提示问题。
暂停程序
Start-Sleep-secondsn要等待的秒数
条件判断
-eq-ne-lt-gt-le-gt
-not!-and-or这是逻辑比较用到的操作符
if(condition){}
elseif(condition){}
...
else{}
以及switch
switch(expression)
{
{test}{codeblock}
value{codeblock}
default{codeblock}
}value是指和expression比较的值
while循环
while(表达式){
...
}
或者
do{
}while(表达式)
表达式可以是$var-eq"";$var-ne"";(表达式1)-and(表达式2)-and(表达式3)
for循环
for(初始化;表达式;STEP){}以及
foreach($name1inCollection1){$name1相关代码....}
返回的集合的处理
get-childitem|Select-Objectpropname1,propname2,propname3
其他有sort-Object;Where-Object;
如get-childitem|sort-object|Where-Object{$_.Length-gt200}这里$_代表集合里当前成员。
定义函数
functionfuncname{...}
funcitonfuncname($x,$y,$z){...}
导入导出CSV文件
export-csvPAth\filname.csv
$csvfil=import-csvPath\filname.csv
***系统管理的一些例子:
获取USB设备:
gwmiWin32_USBControllerDevice-computernameSERVER1|flAntecedent,Dependent
要知道有多少USB设备?
$USBdev=gwmiWin32_USBControllerDevice
write$USBdev.length
中止一个进程:stop-process-idnnnn
输出显示的慢一点:
定义一个函数
functionEasyView{process{$_;Start-Sleep-seconds.5}}
然后,对于输出很多行的命令,
Get-ChildItemN:Data|EasyView
把电脑加入域:
# Acquire credentials for a domain account that has permission to join
$admin = Get-Credential
# these two variables are for convenience in shortening the command line
$user = $admin.UserName
$pw = $admin.GetNetworkCredential().Password
$CS = Get-WmiObject Win32_ComputerSystem
$CS.JoinDomainOrWorkgroup("DOMAIN",$pw,$user,$null,3)
***用于Exchange的命令
获得邮箱的统计报告,并排序
Get-MailboxStatistics–ServerVAN-EX1|Sort-ObjectTotalItemSize–Descending|
FTDisplayName,TotalItemSize,ItemCount
如果只要显示开头5个
Get-MailboxStatistics–ServerVAN-EX1|Sort-ObjectItemCount–Descending|Select-
Object–First5|FTDisplayName,ItemCount
如果要生成一个证书请求并保存为文件
$Data1=New-ExchangeCertificate-GenerateRequest-FriendlyName"Internetcertificate
forVAN-EX2"-SubjectName"DC=com,DC=Adatum,CN=VAN-EX2.adatum.com"-DomainNamemail
.adatum.com
Set-Content-Path"C:\Certificates\VAN-EX2-request.req"-Value$Data1
注意:Set-Content是吧某个文件的内容替换,Add-Content是添加在后面。
管理活动目录里的对象
首先你要import-module ActiveDirectory
创建一个用户, New-ADuser -samAccountName 参数是登录用名
-GivenName -Surname -AcountPassword 这些都是必要的参数
在创建用户的时候要看看同登录名的用户是不是已经存在:
$exuser = get-ADuser -Filter {SamAccountName -eq $SAM}
if ($exuser -eq $Null)
{ $create = New-ADuser -Name $Detailname -Givenname $firstname -Surname $lastname -SamaccountName $SAM -UserPrincipalName $UPN -AccountPassword (ConvertTo-SecureString $password -AsPlainText -Force) -Enabled $true -Path $OU -Company $company -Department $dept
}
else {
echo "The user with samaccount " $SAM " already exist, please create it maually."
Break
}
echo "account created OK."
发送邮件
$outlook = new-object -ComObject Outlook.Application
$mail = $outlook.CreateItem(0)
# 这里0代表olMailItem类型,
$subject = "New User Information "
$mail.Recipients.Add("[email protected]")
$mail.subject = $subject
$mail.body = ("Hello All," + "`r`n" + "`r`n" + "New User Information" + "`r`n" + "First Name :" + " " + $UserFirstname + "`r`n" + "Last Name :" + " " + $lastname +"`r`n" + "Contoso ID# :" + " " + $ID + "`r`n" + "Position :" + " " + $title + "`r`n" + "AD Account Created" + "`r`n" )
$mail.Send()
这个脚本运行时,outlook会反复弹出确认授权执行的提示,按照微软网站设了组策略,仍然是这样,不知道有谁知道怎么才能去掉弹出对话框。
系统启动时执行power shell的脚本。
这个可以设置注册表。
$powershell = (Join-Path $env:windir "system32\WindowsPowerShell\v1.0\powershell.exe")
$RunKey ="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
$itemName = "MyAutorun"
set-ItemProperty -path $RunKey -name $itemName -value ($powershell 脚本路径名和参数)
如果不要自动运行了,
remove-ItemProperty -path $RunKey -name $itemName 即可