1. 程式人生 > >【PowerShell(3)】——互動式

【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擁有自己的指令碼",我自己也沒有操作。