【PowerShell(3)】——互動式
進行數學運算
我們可以把powershell當成一個計算器。象鍵入命令列那樣輸入數學表示式,回車,powershell會自動計算並把結果輸出。常用的加減乘除模(+,-,*,/,%)運算和小括號表示式都支援。
PS C:\> 2+4+9
15
PS C:\> 0xABCD
43981
PowerShell也能自動識別計算機容量單位,包括KB,MB,GB,TB,PB。
PS C:\> 1pb/1tb
1024
PS C:\> 1tb/1gb
1024
PS C:\> 1gb/1kb
1048576
假如一個網站每個頁面大小為80kb,統計顯示每天的PV操作為800,1個月下來佔用的頻寬:
PS C:\> 80kb*800*30/1gb 1.8310546875
假如一個網站的每天人均PV操作為5,頁面大小為80Kb,主機提供商限制的總流量為10G,那平均每天的最大訪客數
PS C:\> 10GB/(80kb*5)/30
873.813333333333
執行外部命令
Powershell 能夠像CMD一樣很好的執行外部命令。
通過netstat檢視網路埠狀態
PS C:\> netstat 活動連線 協議 本地地址 外部地址 狀態 TCP 127.0.0.1:5354 DESKTOP-KO2MDTL:49672 ESTABLISHED TCP 127.0.0.1:5354 DESKTOP-KO2MDTL:49681 ESTABLISHED TCP 127.0.0.1:27015 DESKTOP-KO2MDTL:49905 ESTABLISHED TCP 127.0.0.1:49672 DESKTOP-KO2MDTL:5354 ESTABLISHED TCP 127.0.0.1:49681 DESKTOP-KO2MDTL:5354 ESTABLISHED TCP 127.0.0.1:49825 DESKTOP-KO2MDTL:49826 ESTABLISHED TCP 127.0.0.1:49826 DESKTOP-KO2MDTL:49825 ESTABLISHED TCP 127.0.0.1:49905 DESKTOP-KO2MDTL:27015 ESTABLISHED TCP 127.0.0.1:50023 DESKTOP-KO2MDTL:50024 ESTABLISHED TCP 127.0.0.1:50024 DESKTOP-KO2MDTL:50023 ESTABLISHED ...
啟動CMD控制檯
啟動CMD控制檯鍵入cmd或者cmd.exe,退出cmd可以通過命令exit。
PS C:\> cmd
Microsoft Windows [版本 10.0.16299.125]
(c) 2017 Microsoft Corporation。保留所有權利。
C:\>exit
查詢可用的Cmd控制檯命令
Cmd.exe 通過 /c 來接收命令引數,在Cmd中help可以檢視可用的命令,所以可以通過Cmd /c help 查詢可用的Cmd控制檯命令
PS C:\> cmd /c help 有關某個命令的詳細資訊,請鍵入 HELP 命令名 ASSOC 顯示或修改副檔名關聯。 ATTRIB 顯示或更改檔案屬性。 BREAK 設定或清除擴充套件式 CTRL+C 檢查。 BCDEDIT 設定啟動資料庫中的屬性以控制啟動載入。 CACLS 顯示或修改檔案的訪問控制列表(ACL)。 CALL 從另一個批處理程式呼叫這一個。 CD 顯示當前目錄的名稱或將其更改。
啟動外部程式
為什麼可以通過notpad開啟記事本,不能通過wordpad開啟寫字板?
因為notepad.exe位於C:Windows\system32 這個目錄,而這個目錄已經預設被包含在Powershell的環境變數$env:Path中。
PS C:\> notepad.exe
PS C:\> $env:Path
H:\phpstudy\phpstudy20161103\php\php-5.4.45;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;F:\Git\Git\cmd;F:\svn\bin;E:\BtSoft\ServerAdmin;C:\Users\張三\AppData\Roaming\Composer\vendor\bin;C:\Users\張三\AppData\Local\Microsoft\WindowsApps;C:\GnuWin32\bin
命令集cmdlets
全部命令連結別名
cmdlet 的名稱由一個動詞和一個名片語成,其功能對使用者來講一目瞭然。但是對於一個經常使用powershell命令的人每天敲那麼多命令也很麻煩啊。能不能把命令縮短一點呢?於是“別名”就應運而生了。Powershell內部也實現了很多常用命令的別名。例如Get-ChildItem,列出當前的子檔案或目錄。它有兩個別名:ls 和 dir,這兩個別名來源於unix 的shell和windows的cmd。
因此別名有兩個作用:
- 繼承:繼承unix-shell和windows-cmd。
- 方便:方便使用者使用。
處理別名:
查詢別名所指的真實cmdlet命令
PS C:\> Get-Alias -Name ls
CommandType Name Version Source
----------- ---- ------- ------
Alias ls -> Get-ChildItem
檢視可用的別名,可以通過” ls alias:” 或者 ”Get-Alias“如何檢視所有以Remove打頭的cmdlet的命令的別名呢?PS C:\> ls alias: | where {$_.Definition.StartsWith("Remove")}
CommandType Name Version Source
----------- ---- ------- ------
Alias del -> Remove-Item
Alias erase -> Remove-Item
Alias rbp -> Remove-PSBreakpoint
Alias rd -> Remove-Item
Alias rdr -> Remove-PSDrive
Alias ri -> Remove-Item
Alias rjb -> Remove-Job
Alias rm -> Remove-Item
Alias rmdir -> Remove-Item
Alias rmo -> Remove-Module
Alias rp -> Remove-ItemProperty
Alias rsn -> Remove-PSSession
Alias rsnp -> Remove-PSSnapin
Alias rv -> Remove-Variable
Alias rwmi -> Remove-WmiObject
說明:dir alias:獲取的是別名的陣列,通過where對陣列元素進行遍歷,$_代表當前元素,alias的Definition為String型別,因為powershell支援.net,.net中的string類有一個方法Startswith。通過where過濾集合在powershell中使用非常廣泛。
有的cmdlet命令可能有2-3個別名,我們可以通過下面的命令檢視所有別名和指向cmdlet的別名的個數。
PS C:\> ls alias: | Group-Object Definition | sort -Descending Count
Count Name Group
----- ---- -----
6 Remove-Item {del, erase, rd, ri...}
3 Get-ChildItem {dir, gci, ls}
3 Get-History {ghy, h, history}
3 Copy-Item {copy, cp, cpi}
3 Invoke-WebRequest {curl, iwr, wget}
3 Set-Location {cd, chdir, sl}
3 Get-Content {cat, gc, type}
3 Move-Item {mi, move, mv}
2 Invoke-History {ihy, r}
2 Get-Process {gps, ps}
....
當然你也可以建立、刪除、儲存自己的別名,在這裡就不說,感覺沒有必要,有興趣的朋友可以看我推薦的線上教程。
執行檔案和指令碼
象執行可執行檔案一樣,Powershell執行檔案和指令碼,也必須使用絕對路徑或者相對路徑,或者要執行的檔案必須定義在可受信任的環境變數中。
關於指令碼
指令碼和批處理都屬於偽可執行檔案,它們只是包含了若干命令列直譯器能夠解釋和執行的命令列程式碼。
執行批處理檔案
批處理是副檔名為”.bat”的文字檔案,它可以包含任何cmd控制檯能夠處理的命令。當批處理檔案被開啟,Cmd控制檯會逐行執行每條命令。那Powershell能夠直接執行批處理嗎?
將下列命令儲存為ping.bat
@echo off
echo batch File Test
pause
Dir %windir%/system
PS C:\> ./ping
batch file test
請按任意鍵繼續. . .
通過cmd進入cmd控制檯輸入ping發現執行的不是ping命令,而是直接執行ping.bat ,也就是說可以通過.bat 覆蓋cmd命令。這種機制很危險,如果有人侵入電腦,並將系統內部命令篡改成自己批處理,那就太悲劇了。 這種命令與指令碼的混淆不會發生在powershell中,因為powershell有更安全的機制。PS C:\> cmd
Microsoft Windows [版本 10.0.16299.125]
(c) 2017 Microsoft Corporation。保留所有權利。
C:\>ping
batch file test
請按任意鍵繼續. . .
執行VB指令碼檔案
將下列命令儲存為test.vbs
Set wmi = GetObject("winmgmts:")
Set collection = wmi.ExecQuery("select * from Win32_Process")
For Each process in collection
WScript.Echo process.getObjectText_
Next
PS C:\> ./test.vbs
執行 ./test.vbs 會遍歷當前Win32程序,並把每個程序的詳細資訊通過視窗顯示出來。在powershell中執行VB指令碼
PS C:\PS> cscript.exe test.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.
instance of Win32_Process
{
Caption = "System Idle Process";
CreationClassName = "Win32_Process";
CSCreationClassName = "Win32_ComputerSystem";
....
執行powershell指令碼
Powershell擁有自己的指令碼,副檔名為“.ps1”
初次執行指令碼時,可能會碰到一個異常:
File ” C:\PS\test.ps1″ cannot be loaded because the
execution of scripts is disabled on this system. Please see
“get-help about_signing” for more details.
At line:1 char:10
+ .test.ps1 <<<<
這是powershell的預設安全設定禁用了執行指令碼,要啟用這個功能需要擁有管理員的許可權。
Powershell呼叫入口的優先順序
別名:控制檯首先會尋找輸入是否為一個別名,如果是,執行別名所指的命令。因此我們可以通過別名覆蓋任意powershell命令,因為別名的優先順序最高。
函式:如果沒有找到別名,會繼續尋找函式,函式類似別名,只不過它包含了更多的powershell命令。因此可以自定義函式擴充cmdlet 把常用的引數給固化進去。
命令:如果沒有找到函式,控制檯會繼續尋找命令,即cmdlet,powershell的內部命令。
指令碼:沒有找到命令,繼續尋找副檔名為“.ps1”的Powershell指令碼。
檔案:沒有找到指令碼,會繼續尋找檔案,如果沒有可用的檔案,控制檯會丟擲異常。
The term ‘now’ is not recognized as the name of a cmdlet, function, script file, or operable program. Chec
g of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:4
+ now <<<<
+ CategoryInfo : ObjectNotFound: (now:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
注:我自己也是按照線上教程上的操作的,在一些細節上和教程還是不一樣的,大家也要按照自己的實際情況進行除錯和學習。關於最後一點的"Powershell擁有自己的指令碼",我自己也沒有操作。