Powershell錯(cuò)誤處理之what-if
自動(dòng)化具有高度方便的特點(diǎn),同時(shí)也可能會(huì)自動(dòng)產(chǎn)生一些不可避免的錯(cuò)誤。這也就是Powershell為什么會(huì)有一些專(zhuān)門(mén)來(lái)防止和處理危險(xiǎn)的機(jī)制:這些機(jī)制會(huì)對(duì)接下來(lái)要執(zhí)行的操作進(jìn)行確認(rèn)。
試運(yùn)行:模擬操作
如果你想知道一個(gè)確定的命令會(huì)產(chǎn)生什么影響,你可以進(jìn)行試運(yùn)行。這時(shí),Powershell不會(huì)執(zhí)行任何對(duì)系統(tǒng)有影響的操作,只會(huì)告訴你如果沒(méi)有模擬運(yùn)行,可能產(chǎn)生什么影響和后果。通過(guò)-whatif 參數(shù)。事實(shí)上,許多cmdltes都支持試運(yùn)行。
#如果執(zhí)行stop-process -name *a*會(huì)終止下面的進(jìn)程。 Stop-Process -Name *a* -WhatIf WhatIf: 對(duì)目標(biāo)“AcroRd32 (4544)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“AcroRd32 (4836)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“Alipaybsm (2888)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“AlipaySafeTran (2808)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“AlipaySecSvc (1656)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“AliveService (1684)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“CBGrabConnect_x64 (6052)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“FlashUtil32_11_2_202_235_ActiveX (1136)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“IAStorDataMgrSvc (2920)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“IAStorIcon (3112)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“l(fā)sass (740)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“notepad++ (5124)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“RAVCpl64 (3484)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“SearchIndexer (3788)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“taskhost (2304)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“unsecapp (264)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“unsecapp (2680)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“wlanext (1420)”執(zhí)行操作“Stop-Process”。 WhatIf: 對(duì)目標(biāo)“ZhuDongFangYu (1156)”執(zhí)行操作“Stop-Process”。
當(dāng)然如果你想讓自己的腳本和函數(shù)也支持模擬運(yùn)行,只需要進(jìn)行簡(jiǎn)單的整合。多增加一個(gè)switch參數(shù)。
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 } } # 首先進(jìn)行模擬運(yùn)行: MapDrive k 127.0.0.1c$ -whatif WhatIf: creation of a network drive with letter k: at destination 127.0.0.1c$ # 執(zhí)行命令 MapDrive k 127.0.0.1c$ Name Provider Root ---- -------- ---- k FileSystem 127.0.0.1c$
逐步確認(rèn):逐個(gè)查詢
正如之前看到的那樣,在使用“*”通配符時(shí),可能會(huì)在瞬間產(chǎn)生許多任務(wù)。為了防止產(chǎn)生失誤操作,可以逐個(gè)進(jìn)行確認(rèn),逐個(gè)進(jìn)行放行。
Stop-Process -Name *cm* -Confirm 確認(rèn) 是否確實(shí)要執(zhí)行此操作? 對(duì)目標(biāo)“cmd (1012)”執(zhí)行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (默認(rèn)值為“Y”): ? Y - 僅繼續(xù)執(zhí)行操作的下一步驟。 A - 繼續(xù)執(zhí)行操作的所有步驟。 N - 跳過(guò)此操作并繼續(xù)執(zhí)行下一操作。 L - 跳過(guò)此操作及所有后續(xù)操作。 S - 暫停當(dāng)前管道并返回到命令提示符。鍵入“exit”可繼續(xù)執(zhí)行該管道。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (默認(rèn)值為“Y”): N 確認(rèn) 是否確實(shí)要執(zhí)行此操作? 對(duì)目標(biāo)“cmd (3704)”執(zhí)行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (默認(rèn)值為“Y”): s PS E:>>> PS E:>>> exit 確認(rèn) 是否確實(shí)要執(zhí)行此操作? 對(duì)目標(biāo)“cmd (3704)”執(zhí)行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (默認(rèn)值為“Y”): y 確認(rèn) 是否確實(shí)要執(zhí)行此操作? 對(duì)目標(biāo)“cmd (4404)”執(zhí)行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (默認(rèn)值為“Y”): a
確認(rèn)程序提供了6個(gè)選項(xiàng)。
是 – 僅繼續(xù)執(zhí)行操作的下一步驟。
全是 – 繼續(xù)執(zhí)行操作的所有步驟。
否 – 跳過(guò)此操作并繼續(xù)執(zhí)行下一操作。
不全是 – 跳過(guò)此操作及所有后續(xù)操作。
掛起 – 暫停當(dāng)前管道并返回到命令提示符。鍵入“exit”可繼續(xù)執(zhí)行該管道。
幫助 – 提供幫助信息
自動(dòng)對(duì)危險(xiǎn)的操作進(jìn)行操作
因?yàn)橐恍┎僮鞯奈kU(xiǎn)系數(shù)會(huì)比其它的操作的危險(xiǎn)系數(shù)高,所以Powershell腳本的開(kāi)發(fā)者會(huì)每一條命令進(jìn)行風(fēng)險(xiǎn)評(píng)估。例如Stop-Process,它會(huì)終止當(dāng)前正在運(yùn)行的程序或者進(jìn)程。它的危險(xiǎn)系數(shù)被設(shè)置為中等。因?yàn)檎G闆r下,可能會(huì)產(chǎn)生的不可恢復(fù)并且不可預(yù)知的危險(xiǎn)。例如Exchange中的命令刪除用戶的郵件被歸類(lèi)為高危險(xiǎn)性,因?yàn)猷]件一旦刪除那就意味著所有的郵件內(nèi)容都不復(fù)存在。
你不可能改變這些風(fēng)險(xiǎn)評(píng)估,但是你可以對(duì)此作出回應(yīng)。powershell的默認(rèn)設(shè)置會(huì)將自動(dòng)化的操作歸類(lèi)為危險(xiǎn)操作,即使你沒(méi)有指定-confirm參數(shù)。這一標(biāo)準(zhǔn)的設(shè)置被存儲(chǔ)在全局變量$ConfirmPreference中。$ConfirmPreference可以對(duì)默認(rèn)設(shè)置或者其它更嚴(yán)格的設(shè)置作出判斷與回應(yīng)。但是如果你將$ConfirmPreference的值設(shè)置為“None”,Powershell就不會(huì)進(jìn)行操作前詢問(wèn)確認(rèn),即使可能面臨高風(fēng)險(xiǎn)的操作。
#查看$ConfirmPreference支持的設(shè)置 [ENUM]::GetNames($ConfirmPreference.GetType()) None Low Medium High #查看當(dāng)前的$ConfirmPreference $ConfirmPreference High 確認(rèn) 是否確實(shí)要執(zhí)行此操作? 對(duì)目標(biāo)“calc (5144)”執(zhí)行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (默認(rèn)值為“Y”): y
總結(jié)一下,就會(huì)有兩種情況。
危險(xiǎn)環(huán)境:如果你對(duì)要執(zhí)行的操作的危險(xiǎn)性不確定,最好將$ConfirmPreference 設(shè)置為low,這樣可以更安全一點(diǎn)。
安全環(huán)境:如果你在某些情況下要執(zhí)行大量無(wú)關(guān)安全的操作,為了方便起見(jiàn)可以將$ConfirmPreference設(shè)置為None,因?yàn)獒槍?duì)每個(gè)命令都去設(shè)置-confirm 為false也是一件很繁瑣的事情。但是建議最好在腳本中將$ConfirmPreference設(shè)置為”None”,這樣可以將放權(quán)設(shè)置在最小的風(fēng)險(xiǎn)下。
- Powershell 查詢 Windows 日志的方法
- Powershell 查找用戶的主SMTP地址
- powershell解決win10開(kāi)始菜單和通知中心無(wú)法打開(kāi)
- Powershell 獲取特定的網(wǎng)頁(yè)信息的代碼
- PowerShell 4.0實(shí)現(xiàn)自動(dòng)化設(shè)置服務(wù)器
- 揭秘PowerShell 5.0新特性和新功能
- Windows 8 中的 PowerShell 3.0
- PowerShell使用小技巧分享
- 使用PowerShell修改注冊(cè)表
- PowerShell用戶認(rèn)證Function實(shí)例代碼
相關(guān)文章
PowerShell Out-File向只讀文件寫(xiě)入內(nèi)容的方法
這篇文章主要介紹了PowerShell Out-File向只讀文件寫(xiě)入內(nèi)容的方法,只需要加一個(gè)-Force參數(shù)即可,需要的朋友可以參考下2014-08-08PowerShell實(shí)現(xiàn)在字符串中查找大寫(xiě)字母
這篇文章主要介紹了PowerShell實(shí)現(xiàn)在字符串中查找大寫(xiě)字母,本文講解使用.NET中的IsUpper()函數(shù)來(lái)實(shí)現(xiàn)查找大寫(xiě)字母的需求,需要的朋友可以參考下2015-06-06PowerShell中使用Get-ChildItem命令讀取目錄、文件列表使用例子和小技巧
這篇文章主要介紹了PowerShell中使用Get-ChildItem命令讀取目錄、文件列表使用例子和小技巧,比如只讀取目錄列表的方法,只讀取文件列表的方法,需要的朋友可以參考下2014-08-08PowerShell腳本開(kāi)發(fā)之對(duì)指定IP進(jìn)行端口掃描
在本文通過(guò)一段小腳本的方式引入了通過(guò)PowerShell實(shí)現(xiàn)簡(jiǎn)單安全滲透功能的想法,首先介紹了該小腳本是如何實(shí)現(xiàn)功能的,接下來(lái)對(duì)創(chuàng)建腳本工具集并導(dǎo)入的方法,隨后又在該工具集中創(chuàng)建了Test-TCPPort函數(shù),并介紹了調(diào)用方法.2014-10-10使用PowerShell操作Windows服務(wù)的命令小結(jié)
這篇文章主要介紹了使用PowerShell操作Windows服務(wù)的命令小結(jié),本文只是做了一個(gè)命令列表,需要的朋友可以參考下2014-08-08PowerShell入門(mén)教程之PowerShell和Cmd命令行的關(guān)系?
這篇文章主要介紹了PowerShell入門(mén)教程之PowerShell和Cmd命令行的關(guān)系?本文講解了PowerShell中的CMD命令、PowerShell與Cmd命令行的關(guān)系、Cmd命令行會(huì)被PowerShell替代嗎等內(nèi)容,需要的朋友可以參考下2014-10-10PowerShell中使用.NET將程序集加入全局程序集緩存
這篇文章主要介紹了PowerShell中使用.NET將程序集加入全局程序集緩存,本文介紹了兩種方法實(shí)現(xiàn)把程序集加入全局程序集緩存,著重講解了使用.Net的類(lèi)庫(kù)解決這個(gè)需求,需要的朋友可以參考下2015-06-06Powershell小技巧之使用Jint引擎在PowerShell中執(zhí)行Javascript函數(shù)
這里演示如何利用PowerShell將一段Javascript函數(shù)字符串交給Jint引擎去執(zhí)行。方法很簡(jiǎn)單,希望對(duì)大家有所幫助2014-09-09Windows Powershell 命令返回?cái)?shù)組
這篇文章主要介紹了Windows Powershell 命令返回?cái)?shù)組的使用方法,需要的朋友可以參考下2014-09-09