如果檔名字或路徑中有空格,需要用(')引號將命令擴起來,同時在前面加上符號(&),這種叫做呼叫操作
要運行當前目錄下的命令,需要檔名前加.\
cmdlet:動詞-名詞
Get-Command -Name *Process
-參數名稱 值
其中輸入”Get-Command -Name *Process”的時候,不用輸入完整的命令名,PowerShell會幫助你使用Tab鍵來自動完成命令輸入,包括命令的名稱和引數的名稱,如這樣輸入即可:Get-Comm<Tab> -N<Tab> *Process。
以輸入 Get-Process 這行指令來說,我們就可以在輸入 Get-Pr 這幾個字之後,按下 Tab 來補齊後續的指令名稱,如果以這幾個字母開頭的指令有很多個的話,則會依序顯示每一個可能的組合,我們可以多按幾下 Tab 鍵來尋找自己想要輸入的指令。
PowerShell 的指令是不分大小寫的,所以可以全部都以小寫輸入。
get-help [命令]
可以得到別名跟用法
get-help get-command
$?:布林型變數,返回最後執行命令的成功還是失敗:
True/False
在PowerShell視窗中,按上下箭頭鍵可以尋找歷史命令進行呼叫,也可以執行Get-History命令查詢,用Invoke-History Id方式進行呼叫:
使用out-file 輸出傳回值到檔案
[命令] | out-file [檔名]
ls | Out-File a.txt
如果想生成當前會話的記錄,可以執行Start-Transcript命令,它基於當前系統時間。如果想停止,執行Stop-Transcript
顯示受格式化的輸出
ls | Format-List
ls | Format-Table
在 PowerShell 中,變數名稱都是以錢字號($)開頭,若要把 Get-Process 指令的查詢結果儲存下來,可以這樣寫:
$process = Get-Process -Name Greenshot
PowerShell 本身在設計時就考慮了許多系統管理者的需求,除了可使用 .NET 框架的物件之外,還有其他很多方便的小功能,像在電腦上常用的 KB、MB、GB 等單位,也可以在 PowerShell 中直接使用,例如計算 2TB 的資料以每秒 3.5 MB 的速度備份,需要幾個小時:
2TB / 3.5MB / 3600
166.440634920635
[DateTime] "21:45" - [DateTime]::Now
Days : 0
Hours : 11
Minutes : 22
Seconds : 44
Milliseconds : 956
Ticks : 409649565189
TotalDays : 0.474131441190972
TotalHours : 11.3791545885833
TotalMinutes : 682.749275315
TotalSeconds : 40964.9565189
TotalMilliseconds : 40964956.5189
這裡用中括號包起來的 [DateTime] 代表 System.DateTime 這個類別,[DateTime] "21:45" 的作用是將 "21:45" 這個字串轉換為 System.DateTime 的物件。
後面的 [DateTime]::Now 代表呼叫 System.DateTime 類別內的 Now 靜態函數,傳回現在的時間,與前面的時間相減之後,就得到間隔的時間了。
PowerShell 的管線符號為 |,只要上一個指令所產生的物件類型可以被下一個指令接受,就可以用管線符號直接串接起來使用。例如我們可以使用 Get-Process 指令找出 Edge 瀏覽器的行程,然後將結果直接導給 Stop-Process,關閉 Edge 瀏覽器:
Get-Process -Name MicrosoftEdge | Stop-Process
為了讓管理者可以方便確認要執行的實際動作,PowerShell 在許多的指令中都提供了 -WhatIf 與 -Confirm 的功能,可讓管理者在執行重要指令之前,可以先確認一下。
在我們確認所有的動作都沒問題之後,再將 -WhatIf 參數拿掉,實際這些動作,就可以確保不會下錯指令。 (只會顯示不會執行)
另外一種方式是使用 -Confirm 參數,它會讓指令在執行每一項動作時,都讓使用者確認一次,這樣也可以確保執行的動作是正確的: (確認後執行)
若要查詢一個物件有哪些屬性與方法,可以將物件透過管線的方式導給 Get-Member,例如查詢 "Hello" 這個字串物件的屬性與方法:
$webClient = New-Object System.Net.WebClient
$url = "https://www.google.com/"
$content = $webClient.DownloadString($url)
$content > google.html
>可以取代out-file
若要以指令稿檔案的方式執行這段程式碼,首先要把它們儲存成 PowerShell 的指令搞檔案(副檔名為 .ps1)
在執行一系列的指令之後,若想要將執行過的動作儲存成整份的指令稿,可以使用 Get-History 取得歷史指令之後,用 Foreach-Object 抽出實際的指令內容,然後再導入檔案中儲存起來:
Get-History | Foreach-Object { $_.CommandLine } > C:\OfficeGuide\script2.ps1
#單行註解
<#
多行註解
#>
而在熟悉這套操作模式之後,就可以用相同的方法瀏覽 Windows 的登錄機碼:
Set-Location HKCU:\Software\Microsoft\Windows\
Get-ChildItem
#瀏覽憑證
Set-Location cert:\CurrentUser\Root
Get-ChildItem
if(Boolean_expression) {
// Executes when the Boolean expression is true
}else {
// Executes when the Boolean expression is false
}
#elseif 不用空格
if(Boolean_expression 1) {
// Executes when the Boolean expression 1 is true
}elseif(Boolean_expression 2) {
// Executes when the Boolean expression 2 is true
}elseif(Boolean_expression 3) {
// Executes when the Boolean expression 3 is true
}else {
// Executes when the none of the above condition is true.
}
> $a = 10
> $b = 20
> $c = $a + $b
> $c
30
> $c += $a
> $c
40
> $c -= $a
> $c
30
# +-*/%都可以用(跟C#一樣)
#陣列
$A = 1, 2, 3, 4
or
$A = 1..4
#迴圈
> $array = @("item1", "item2", "item3")
> for($i = 0; $i -lt $array.length; $i++){ $array[$i] }
item1
item2
item3
#[型別]$名稱
[int32[]]$intA = 1500,2230,3350,4000
如果傳回一個陣列,PS會把他都秀出來
> $array = @("item1", "item2", "item3")
> foreach ($element in $array) { $element }
item1
item2
item3
> $array = @("item1", "item2", "item3")
$counter = 0;
while($counter -lt $array.length){
$array[$counter]
$counter += 1
}
item1
item2
item3
> $array = @("item1", "item2", "item3")
$counter = 0;
do {
$array[$counter]
$counter += 1
} while($counter -lt $array.length)
item1
item2
item3
传递给一个函数或者一个脚本的参数都保存在$args变量中。可以先打开记事本,输入脚本:
Write-Host "Hello,$args"
For($i=0;$i -lt $args.Count; $i++)
{
Write-Host "parameter $i : $($args[$i])"
}
所以最好的方式给参数指定名称,输入以下的脚本:
param($Directory,$FileName)
"Directory= $Directory"
"FileName=$FileName"
其中param给参数指定名称。
.MyScript.ps1 -Directory $env:windir -FileName config.xml
Powershell默认使用全局作用域global: ,但是在函数和脚本中分别使用函数作用域function:和脚本作用域script: 。
一旦脚本执行结束,存在于脚本作用域的变量也会消失。但是有一点,如果一个变量在脚本外定义,在脚本内没有定义,在脚本内使用时会把外面的变量引渡过来。