Powershell初探

李維修 2014.11.21 在Windows Server 平台上,PowerShell是重要的指令化管理工具。以下整理工作中常用的筆記。
原始出處主要參考:
PowerShell的優點
1.物件導向,每個可執行的語法( Cmdlet )的命名都是動詞-名詞,如  Get-Acl,具結構性,好理解。
2.更容易探索Windows底層資訊(如WMI)
3.改善以往.VBS、bat檔編寫語法不一致的困擾。例如只要了解 Sort-Object 的用法,就能將大多數 Cmdlet 的輸出排序。
4.可呼叫.net、com,也保留對以往DOS指令的支援。
如何查詢語法與線上說明
Get-help 您要查的Cmdlet
例如 Get-help get-date
會出現 
相關連結
    Online version: http://go.microsoft.com/fwlink/?LinkID=113313
    Set-Date 
    New-TimeSpan 
註解
    若要查看範例,請輸入: "get-help Get-Date -examples".
    如需詳細資訊,請輸入: "get-help Get-Date -detailed".
    如需技術資訊,請輸入: "get-help Get-Date -full".
變數宣告
以$字號表示,如   $ServiceName


Pipe的觀念
Powershell可將「上一動」指令的結果,交給下一動繼續處理或執行。
例如:  Get-Acl d:\ | Format-List
是先列出D槽ACL的狀況,再交由下一個指令做格式化輸出。
又如    get-date | Get-Member
先找出日期,再轉給Get-Member找出底下包含的屬性內容。
PowerShell有好用的編輯器嗎?
當然有,且具備 IntelliSense功能。請在PowerShell命令列下輸入:powershell_ise 
PowerShell 第一次不能執行怎麼辦?
執行以下指令,允許程式碼執行。
Set-ExecutionPolicy RemoteSigned
清除畫面
跟Dos相同,  cls   。
如何寫註解
單行可用 #
多行可用 <#  #>將程式碼包起來
印出變數
write-host $var1
彈出視窗(用不太到了)
$wsh = New-Object -ComObject WScript.Shell
$wsh.Popup("xxxxxx")
日期格式
備份或排程工作,經常需要使用日期。欲取出日期格式如下:
get-date -format "yyyy-MM-dd  hh:mm:ss"
get-date -format "yyyy-MM-dd  HH:mm:ss"
注意格式化字串有分大小寫,小時處如要使用24小時制,需大寫。
日期的加減  (好簡單,終於不用像在bat檔內加減日期那麼痛苦了)
$now = Get-Date
$now.AddDays(3)
建立目錄
New-Item -Path "D:\Vm_Export\123456" -ItemType "directory" 
刪除目錄(包含底下子目錄,不詢問)
Remove-Item "D:\Vm_Export\123456"  -Recurse
複製檔案
Copy-Item -Path $env:Temp\file.txt -Destination $env:temp\file.bak  -Force
尋找Windows Update安裝過的Patch
get-hotfix -Description *security* | Sort-Object installedon, hotfixid -Descending
查詢Process
1.包含特定關鍵字者(因本校使用Nod防毒軟體,ProcessName 為egui 或 ekrn )
Get-Process -name e*
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName                                                                           
-------  ------    -----      ----- -----   ------     -- -----------                                                                           
    165      17     3312      14044   116     0.55   6640 egui                                                                                  
    418      31   102628     105196   207 2,998.20   1620 ekrn                                                                                  
   1553     294    62108     174796   778    59.78   6864 explorer
2.查詢執行時間大於1秒,包含e-f開頭的Process
get-process | where-object {$_.cpu -gt 1 -and $_.processname -like "[e-f]*"}
#查32位元軟體內包含某軟體關鍵字
Get-WMIObject -Class Win32_Product -ComputerName . -Filter "name like'%eset%'" | FT
將搜尋結果寫入文字檔
dir C:\Windows | Out-File files.txt  
檢查有無設定螢幕保護程式 
Get-WmiObject -query "select * from Win32_Desktop where name like '%administrator' "
Name               : WIN-FUDLIS8NNSO\Administrator
ScreenSaverActive  : True
ScreenSaverSecure  : True
ScreenSaverTimeout : 360
SettingID          :
把寫入Log檔包裝成函數
(原始出處參考:五餅二魚工作室:http://www.dotblogs.com.tw/jamesfu/archive/2014/05/16/autostartservice.aspx)
#寫入log
$Logfile = "C:\Temp\$(gc env:computername)_AutoStart.log"
$ServiceName = "HyperV"
$PROCESSNAME = "QQ"
 Function LogWrite
 {
    Param ([string]$logstring)
    Add-content $Logfile -value $logstring
 }
LogWrite "$(Get-Date)`tService [$ServiceName] state : 您要寫的文字 " 

抓取硬碟空間
$strComputer = "." 
$Disks = Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType = 3"`
 -ComputerName $strComputer 
foreach ($Disk in $Disks) 
$ID = "磁碟機代碼:{0}" -f $Disk.DeviceID 
$Label = "磁碟機名稱:{0}" -f $Disk.VolumeName 
$Size = "磁碟機大小:{0:0.0} GB" -f ($Disk.Size / 1GB) 
$FreeSpace = "剩餘的空間:{0:0.0} GB" -f ($Disk.FreeSpace / 1GB) 
$Used = ([int64]$Disk.size - [int64]$Disk.FreeSpace) 
$SpaceUsed = "已用的空間:{0:0.0} GB" -f ($Used / 1GB) 
$Percent = ($Used * 100.0)/$Disk.Size 
$Percent = "已用的比例:{0:N0}" -f $Percent 
"---------------------" 
"$ID" 
"$Label" 
"$Size" 
"$FreeSpace" 
"$SpaceUsed" 
"$Percent %"
}
Get-WMIObject -Class Win32_LogicalDisk -Filter "DriveType<>5"  | FT
匯出HyperV
無AD的情形下會失敗,因為權限不足,只能寫到本機
Export-VM -Name "99.163" -Path \\140.126.xx.xx\VSshare
以下的指令可用
Export-VM -Name "99.163" -Path  Z:\vm_131
※順手測試另一套工具,會占用7%的CPU,而且速度很慢。
HVBackup -l "99.163" -o  Z:\vm_131
查看複寫情形
Get-VMReplication | Format-List
查看記憶體配置
Get-VMMemory "22.xxxxxx"
寄發Email
$smtpServer = "140.126.xx.xx"
$smtpFrom = "xxx@mail.nhcue.edu.tw"
$smtpTo = "yyy@mail.nhcue.edu.tw"
$messageSubject = "虛擬機器備份通知"
$body = "您的機器備份成功。"
send-mailmessage -from "$smtpFrom" -to "$smtpTo" -subject "$messageSubject" -body "$body" -smtpServer "$smtpserver" -Encoding ([System.Text.Encoding]::UTF8)
刪除指定目錄下,超過指定日期之前的子目錄,及其下所有檔案
(用於清理備份檔很好用)
$Now = Get-Date
$Days = "21"
$TargetFolder ="E:\VMBackup\VM_xxxxx"
$ToDeleteDate = $Now.adddays(-$Days)
$ToDeleteVMs = Get-Childitem -path $TargetFolder  |`
Where-Object  -FilterScript {  ($_.LastWriteTime -le $ToDeleteDate)  }
foreach ($vm in $ToDeleteVMs)
{
    write-host $vm.name "(" $vm.LastWriteTime ")"
    $RealName= $TargetFolder+"\"+$vm.name + "\"
    #write-host  $RealName
    Remove-Item $RealName -Force -Recurse
}

留言

這個網誌中的熱門文章

The Disk2vhd Disaster — and How StarWind’s V2V Brought Redemption! --About Windows Server 2012 STD P2V

如何刪除Trello的卡片資訊 (deleting Trello cards)

Redis 在 C#的應用