Powershell初探
李維修 2014.11.21
在Windows Server 平台上,PowerShell是重要的指令化管理工具。以下整理工作中常用的筆記。
原始出處主要參考:
- 微軟官方(初階): http://technet.microsoft.com/zh-tw/library/bb978526.aspx
- alexc君之大作:http://ithelp.ithome.com.tw/event/ironmanarticle2/id/20005121/page/3
- Hyper-V的 Powershell http://technet.microsoft.com/en-us/library/hh848559.aspx
- 進階的玩意兒 http://code.tutsplus.com/tutorials/say-hello-to-powershell--net-32056
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".
變數宣告
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
}
留言
張貼留言