将-WhatIf标志传递给powershell脚本中调用的所有cmdlet

时间:2015-03-17 22:42:29

标签: powershell cmdlets

我有一个测试powershell脚本,我试图将whatif标志传递给脚本中的所有cmdlet。在我的脚本中,我调用了3个cmdlet new-Item,copy-item和new-customCmdlet。最后一个是我写的自定义cmdlet。我添加了:

[cmdletBinding(SupportsShouldProcess=$True)] 

同时测试脚本和自定义cmdlet。当我使用-Whatif运行此概念证明脚本时,两个系统cmdlet(New-Item和copy-Item)以whatif模式运行,但自定义不运行。我认为如果cmdlet有supportsShouldProcess,如果脚本在whatif中运行,它应该得到whatif标志。这是两个系统cmdlet的情况,但不是我的。我已经阅读了有关查看调用堆栈的其他文章,我了解如何查看whatif是否已设置。对于此示例,我只希望cmdlet使用运行脚本的-whatif标志。

这是我使用whatif标志运行的脚本: PS c:> script.ps1 -WhatIf

[cmdletBinding(SupportsShouldProcess=$True)]
param()
Import-Module c:\mycmdlet.dll

New-Item -ItemType file NewItem.txt
Copy-Item item1.txt copiedItem.txt
Copy-Custom test.txt CopiedTest.txt

以下是cmdlet代码:

using System;
using System.Collections.Generic;
using System.Management.Automation;
using System.Reflection;

namespace poc.whatif.Cmdlet
{
    [Cmdlet(VerbsCommon.Copy, "Custom")]
    public class CopyCustom : PSCmdlet
    {
        #region paramaters
        [Parameter(Mandatory = true,
            ValueFromPipelineByPropertyName = true,
            ValueFromPipeline = true,
            Position = 0,
            HelpMessage = "Source File")]
        public string srcFile { get; set; }

        [Parameter(Mandatory = true,
            ValueFromPipelineByPropertyName = true,
            ValueFromPipeline = true,
            Position = 0,
            HelpMessage = "Target File")]
        public string targetFile { get; set; }
        #endregion


    protected override void BeginProcessing()
    {
        WriteVerbose("Starting Copy-Custom");
    }

    protected override void ProcessRecord()
    {
       WriteVerbose("Copying files from here to there");   
    }

    protected override void EndProcessing()
    {
        WriteVerbose("Ending Copy-Custom");
    }
}

3 个答案:

答案 0 :(得分:0)

我不使用C#cmdlet,但据我所知,您的自定义cmdlet尚未声明它支持ShouldProcess,那么它如何才能使用它?例如:

[Cmdlet(VerbsCommon.Copy, "Custom")]

应该是

[Cmdlet(VerbsCommon.Copy, "Custom", SupportsShouldProcess = true)]

然后你需要在begin / processing / end-methods中使用ShouldProcess() - 方法来实际定义whatif-message应该说的位置以及何时应该说出来。

答案 1 :(得分:0)

您错过了SupportShouldProcess属性。此外,您错过了对ShouldProcess的调用,同时请确保查看ShouldContinue并使用Force参数。有关详细信息,请参阅required development guidelines

重写ProcessRecord:

protected override void ProcessRecord()
{
    if(ShouldProcess("target","action"))
    {
        if(ShouldContinue("Do Stuff","Do stuff to this object?"))
        {
            WriteVerbose("Copying files from here to there");
        }
    }
}

答案 2 :(得分:0)

我对C#了解不多,但preference variable $WhatIfPreference似乎非常与您的问题范围相关。

  

确定是否为每个命令自动启用WhatIf           支持它。启用WhatIf时,cmdlet将报告           预期的命令效果,但不执行命令。

因此,如果您只是在讨论支持-WhatIf的大多数内置cmdlet,那么我认为这只是一个问题:

$WhatIfPreference = 1 # Default is 0