首页 > 代码库 > Cmdlet开发与学习(四)
Cmdlet开发与学习(四)
前面讲完了一个基本的cmdlet的开发流程,下面将陆续地完善cmdlet的功能细节以及补充。
支持ShouldProcess
有的cmdlet操作有很大的破坏性,因此有必要再命令执行前提醒用户注意一些可能的执行后果,也就是说,存在与用户的交互。这个时候,通过使用ShouldProcess,可以达到预期的效果。
1 [Cmdlet(VerbsCommon.Get,"SQLServerBackupFile", 2 SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.Medium)] 3 public class GetSQLServerBackup : PSCmdlet 4 { 5 private string path; 6 7 [Parameter] 8 public string Path 9 { 10 get { return path; } 11 set { path = value; } 12 } 13 14 protected override void ProcessRecord() 15 { 16 if (Directory.Exists(path)) 17 { 18 if (this.ShouldProcess(path, "Show Specified Directory " + path)) 19 { 20 string[] files = Directory.GetFiles(path); 21 foreach (string itemFile in files) 22 { 23 FileInfo tempInfo = new FileInfo(itemFile); 24 if (tempInfo.Extension.Equals(".bak", StringComparison.OrdinalIgnoreCase)) 25 { 26 WriteObject(tempInfo); 27 } 28 } 29 } 30 } 31 } 32 }
查看上面的例子,为了使一个cmdlet支持ShouldProcess,需要执行下面的步骤:
1.设置cmdlet的SupportsShouldProcess属性为真,则该cmdlet就可以支持ShouldProcess
2.使用cmdlet的属性ConfirmImpact,设置cmdlet的影响确认等级。如果此属性没有设置的话,默认值是Medium
3.在cmdlet逻辑中添加新的代码,在破坏性操作执行前都调用ShouldProcess方法
具体效果如下:
更进一步说明:
ConfirmImpact
我们在使用PowerShell的时候,有时,即使没有-confirm参数,会发现cmdlet对每次操作也需要进行确认。这是怎么一回事呢?在这里,需要先介绍2个概念。
优先确认等级(Confirming Preference Level):这是在会话变量$ConfirmPreference中设置的(默认值为High)
影响确认等级(Confirming Impact Level):这是在cmdlet的声明中设置的(默认值为Medium)
如果影响确认等级比优先确认等级高或者相同,PowerShell就会等待确认。如果cmdlet调用时添加了-confirm参数,PowerShell就会暂时设置优先确认等级为Low。此时,只要影响确认等级不为None,PowerShell都会提示确认。
如果设置$ConfirmPreference为None,则所有与ShouldProcess有关的提示信息都将被禁止。
ShouldContinue
细心的开发在添加ShouldProcess方法的时候,会发现还有个ShouldContinue方法。
ShouldContinue允许cmdlet无条件进行提示确认。也就是说,此时,不论影响确认等级和优先确认等级如何,都会有确认提示。
事实上,即使不用声明SupportsShouldProcess也可以使用ShouldContinue。