首页 > 代码库 > 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。