在Cmdlet中,如何检测Debug标志是否已设置?

时间:2012-03-27 18:13:18

标签: c# powershell

我正在编写PowerShell Cmdlet并使用WriteDebug,但我想编写一个需要额外API调用的对象,而且在调试关闭时我宁愿不进行调用。如何检测Debug标志是否已设置,以便我可以完全跳过对WriteDebug的调用?

例如,我的WriteDebug调用将如下所示:

WriteDebug(string.Format("Name : {0}", api.GetName(myobj)));

在该示例中,除非打开调试,否则我希望避免调用api.GetName

4 个答案:

答案 0 :(得分:3)

试试这个:

$Debug = $psboundparameters.debug.ispresent


if ($Debug){
  Write-Debug(string.Format("Name : {0}", api.GetName(myobj))
  }

答案 1 :(得分:2)

要从C#访问Debug标志,你应该可以做与mjolinor建议基本相同的事情:

if (this.MyInvocation.BoundParameters.ContainsKey("Debug"))
{
    ... do something ...
}

但是,请注意,您可以使用值false指定debug参数:

MyCmdlet -Debug:$false

要处理这种情况,你可能想要添加这样的东西(在PSCmdlet中):

bool debug = MyInvocation.BoundParameters.ContainsKey("Debug") &&
             ((SwitchParameter)MyInvocation.BoundParameters["Debug"]).ToBool();

在C#中,BoundParameters是一个字典,所以你也可以使用TryGetValue(),但请注意,开关的值(如Debug)是一个SwitchParameter而不是bool。

有关详细信息,请参阅以下内容:

答案 2 :(得分:2)

实验表明您可能希望查看$ DebugPreference变量。我尝试使用高级函数,但它在cmdlet中也可以正常工作。

尝试以下命令序列:

function f { [cmdletbinding()]Param() $DebugPreference }
function g { [cmdletbinding()]Param() f }
f
f -Debug
g
g -Debug

答案 3 :(得分:2)

只需检查-Debug标志是否已设置,可以使用下面的代码完成,但这还不够。

bool debug = false;
bool containsDebug = MyInvocation.BoundParameters.ContainsKey("Debug");
if (containsDebug)
    debug = ((SwitchParameter)MyInvocation.BoundParameters["Debug"]).ToBool();

PowerShell还允许您设置一个名为$ DebugPreference的全局标志,上面的代码不会检查。从另一个cmdlet调用cmdlet会继承这些公共参数,这些参数不会通过Debug标志继承,因为上面的代码会检查。下面的代码将检查$ DebugPreference并解决这些问题。

debug = (ActionPreference)GetVariableValue("DebugPreference") != ActionPreference.SilentlyContinue;

不幸的是in contrary to a cmdlet in PowerShell你必须检查两者。所以最终的C#代码如下。我还添加了Verbose通用参数的代码作为奖励。一定要继承PSCmdlet而不是Cmdlet来获取GetVariableValue方法。

bool debug = false;
bool containsDebug = MyInvocation.BoundParameters.ContainsKey("Debug");
if (containsDebug)
    debug = ((SwitchParameter)MyInvocation.BoundParameters["Debug"]).ToBool();
else
    debug = (ActionPreference)GetVariableValue("DebugPreference") != ActionPreference.SilentlyContinue;

bool verbose = false;
bool containsVerbose = MyInvocation.BoundParameters.ContainsKey("Verbose");
if (containsVerbose)
    verbose = ((SwitchParameter)MyInvocation.BoundParameters["Verbose"]).ToBool();
else
    verbose = (ActionPreference)GetVariableValue("VerbosePreference") != ActionPreference.SilentlyContinue;