前面讲完了一个基本的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。