Powershell錯誤處理之what-if

NO IMAGE

自動化具有高度方便的特點,同時也可能會自動產生一些不可避免的錯誤。這也就是Powershell為什麼會有一些專門來防止和處理危險的機制:這些機制會對接下來要執行的操作進行確認。

試執行:模擬操作

如果你想知道一個確定的命令會產生什麼影響,你可以進行試執行。這時,Powershell不會執行任何對系統有影響的操作,只會告訴你如果沒有模擬執行,可能產生什麼影響和後果。通過-whatif 引數。事實上,許多cmdltes都支援試執行。


#如果執行stop-process -name *a*會終止下面的程序。
Stop-Process -Name *a* -WhatIf
WhatIf: 對目標“AcroRd32 (4544)”執行操作“Stop-Process”。
WhatIf: 對目標“AcroRd32 (4836)”執行操作“Stop-Process”。
WhatIf: 對目標“Alipaybsm (2888)”執行操作“Stop-Process”。
WhatIf: 對目標“AlipaySafeTran (2808)”執行操作“Stop-Process”。
WhatIf: 對目標“AlipaySecSvc (1656)”執行操作“Stop-Process”。
WhatIf: 對目標“AliveService (1684)”執行操作“Stop-Process”。
WhatIf: 對目標“CBGrabConnect_x64 (6052)”執行操作“Stop-Process”。
WhatIf: 對目標“FlashUtil32_11_2_202_235_ActiveX (1136)”執行操作“Stop-Process”。
WhatIf: 對目標“IAStorDataMgrSvc (2920)”執行操作“Stop-Process”。
WhatIf: 對目標“IAStorIcon (3112)”執行操作“Stop-Process”。
WhatIf: 對目標“lsass (740)”執行操作“Stop-Process”。
WhatIf: 對目標“notepad   (5124)”執行操作“Stop-Process”。
WhatIf: 對目標“RAVCpl64 (3484)”執行操作“Stop-Process”。
WhatIf: 對目標“SearchIndexer (3788)”執行操作“Stop-Process”。
WhatIf: 對目標“taskhost (2304)”執行操作“Stop-Process”。
WhatIf: 對目標“unsecapp (264)”執行操作“Stop-Process”。
WhatIf: 對目標“unsecapp (2680)”執行操作“Stop-Process”。
WhatIf: 對目標“wlanext (1420)”執行操作“Stop-Process”。
WhatIf: 對目標“ZhuDongFangYu (1156)”執行操作“Stop-Process”。

當然如果你想讓自己的指令碼和函式也支援模擬執行,只需要進行簡單的整合。多增加一個switch引數。


function MapDrive([string]$driveletter, [string]$target, [switch]$whatif)
{
If ($whatif)
{
Write-Host "WhatIf: creation of a network drive "   "with the letter ${driveletter}: at destination $target"
}
Else
{
New-PSDrive $driveletter FileSystem $target
}
}
# 首先進行模擬執行:
MapDrive k 127.0.0.1c$ -whatif
WhatIf: creation of a network drive
with letter k: at destination 127.0.0.1c$
# 執行命令
MapDrive k 127.0.0.1c$
Name Provider Root
---- -------- ----
k FileSystem 127.0.0.1c$

逐步確認:逐個查詢

正如之前看到的那樣,在使用“*”萬用字元時,可能會在瞬間產生許多工。為了防止產生失誤操作,可以逐個進行確認,逐個進行放行。


Stop-Process -Name *cm* -Confirm
確認
是否確實要執行此操作?
對目標“cmd (1012)”執行操作“Stop-Process”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (預設值為“Y”): ?
Y - 僅繼續執行操作的下一步驟。
A - 繼續執行操作的所有步驟。
N - 跳過此操作並繼續執行下一操作。
L - 跳過此操作及所有後續操作。
S - 暫停當前管道並返回到命令提示符。鍵入“exit”可繼續執行該管道。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (預設值為“Y”): N
確認
是否確實要執行此操作?
對目標“cmd (3704)”執行操作“Stop-Process”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (預設值為“Y”): s
PS E:>>>
PS E:>>> exit
確認
是否確實要執行此操作?
對目標“cmd (3704)”執行操作“Stop-Process”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (預設值為“Y”): y
確認
是否確實要執行此操作?
對目標“cmd (4404)”執行操作“Stop-Process”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (預設值為“Y”): a

確認程式提供了6個選項。

是 – 僅繼續執行操作的下一步驟。
全是 – 繼續執行操作的所有步驟。
否 – 跳過此操作並繼續執行下一操作。
不全是 – 跳過此操作及所有後續操作。
掛起 – 暫停當前管道並返回到命令提示符。鍵入“exit”可繼續執行該管道。
幫助 – 提供幫助資訊

自動對危險的操作進行操作

因為一些操作的危險係數會比其它的操作的危險係數高,所以Powershell指令碼的開發者會每一條命令進行風險評估。例如Stop-Process,它會終止當前正在執行的程式或者程序。它的危險係數被設定為中等。因為正常情況下,可能會產生的不可恢復並且不可預知的危險。例如Exchange中的命令刪除使用者的郵件被歸類為高危險性,因為郵件一旦刪除那就意味著所有的郵件內容都不復存在。

你不可能改變這些風險評估,但是你可以對此作出迴應。powershell的預設設定會將自動化的操作歸類為危險操作,即使你沒有指定-confirm引數。這一標準的設定被儲存在全域性變數$ConfirmPreference中。$ConfirmPreference可以對預設設定或者其它更嚴格的設定作出判斷與迴應。但是如果你將$ConfirmPreference的值設定為“None”,Powershell就不會進行操作前詢問確認,即使可能面臨高風險的操作。


#檢視$ConfirmPreference支援的設定
[ENUM]::GetNames($ConfirmPreference.GetType())
None
Low
Medium
High
#檢視當前的$ConfirmPreference
$ConfirmPreference
High
確認
是否確實要執行此操作?
對目標“calc (5144)”執行操作“Stop-Process”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (預設值為“Y”): y

總結一下,就會有兩種情況。

危險環境:如果你對要執行的操作的危險性不確定,最好將$ConfirmPreference 設定為low,這樣可以更安全一點。
安全環境:如果你在某些情況下要執行大量無關安全的操作,為了方便起見可以將$ConfirmPreference設定為None,因為針對每個命令都去設定-confirm 為false也是一件很繁瑣的事情。但是建議最好在指令碼中將$ConfirmPreference設定為”None”,這樣可以將放權設定在最小的風險下。

您可能感興趣的文章:

Powershell 查詢 Windows 日誌的方法Powershell 查詢使用者的主SMTP地址powershell解決win10開始選單和通知中心無法開啟Powershell 獲取特定的網頁資訊的程式碼PowerShell 4.0實現自動化設定伺服器揭祕PowerShell 5.0新特性和新功能Windows 8 中的 PowerShell 3.0PowerShell使用小技巧分享使用PowerShell修改登錄檔PowerShell使用者認證Function例項程式碼