我有一个测试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");
}
}
答案 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