捐血一袋救人一命

2024年3月12日 星期二

Powershell 迴圈

Powershell 迴圈

第一種迴圈

For (<Init 變數初始值>; <Condition 迴圈繼續執行條件>; <Repeat/Step 變數增減運算式>){
    <Statement list>
}

例如:
設定變數 $v = 1,$a = 10
當 $v 數值小於等於 5 時,執行迴圈內指令
變數 $v 的值,每次累加 2

For ($v, $a=1,10; $v -le 5; $v = $v + 2){
    "`$v = $v"
    $a += $v
    "`$a = $a"
}

因為要程式輸出 $,所以 $ 前面要加上 ` 跳脫符號
enter image description here

第二種迴圈

ForEach (<item> in <collection>){
    <Statement list>
}

第三種迴圈

先判斷是否吻合條件

While (<condition){
	<Statement list>
}

第四種迴圈

至少會執行一次,執行後判斷是否吻合條件,條件吻合時繼續執行

Do {
	<Statement list>
} While (<condition>)

第五種迴圈

至少會執行一次,執行後判斷是否吻合條件,條件吻合時結束執行

Do {
	<Statement list>
} Until (<condition>)

第六種迴圈

透過 Pipe 來源,對每個 Object 執行 Statement list

| ForEach-Object{
	<Statement list>
}
$Events = Get-EventLog -LogName System -Newest 1000
$events | ForEach-Object -Begin {Get-Date} -Process {Out-File -FilePath Events.txt -Append -InputObject $_.Message} -End {Get-Date}
Get-Module -ListAvailable | ForEach-Object -MemberName Path

執行字串物件的 Split 方法,參數 “.”

"Microsoft.PowerShell.Host" | ForEach-Object -MemberName Split -ArgumentList  "."
1..2 | ForEach-Object -Begin { '開始' } -Process { '程序 A' } { '程序 B' } -End { '結束' }

Begin 與 End Script Blocks 都只會執行一次,而 Process 後面可以接多個 Script Blocks,會依照傳遞物件的數量來執行次數

以下只有 Powershell v7 才有

$Message = "Output:"

1..8 | ForEach-Object -Parallel {
    "$using:Message $_"
    Start-Sleep 10
} -ThrottleLimit 10

採用多執行緒 -Parallel
執行緒數量 -ThrottleLimit 10
所以程式會一次把 1~8 都輸出,最後等上 10秒才結束程式

如果修改 -ThrottleLimit 為 2,就會每次只輸出兩個數值,並等上 10秒

取得系統事件紀錄(需要以管理者權限執行)

$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'

$logEntries = $logNames | ForEach-Object -Parallel {
    Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5

$logEntries.Count

當使用多執行緒時,要注意系統資源使用量會拉高!

$job = 1..10 | ForEach-Object -Parallel {
    "Output: $_"
    Start-Sleep 3
} -ThrottleLimit 2 -AsJob

$job | Receive-Job -Wait

使用多執行緒,並丟到背景執行,然後用 Receive-Job -Wait 等待並取得執行結果

0 意見: