В командлете, как я могу определить, установлен ли флаг отладки? - PullRequest
4 голосов
/ 27 марта 2012

Я пишу командлет PowerShell и использую WriteDebug , но я хочу написать объект, который требует дополнительного вызова API, и я бы предпочел не делать этот вызов, когда отладка отключена. Как я могу определить, установлен флаг Debug или нет, чтобы я мог полностью пропустить этот вызов WriteDebug?

Например, мой вызов WriteDebug будет выглядеть примерно так:

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

В этом примере я хочу избежать вызова на api.GetName, если не включена отладка.

Ответы [ 4 ]

3 голосов
/ 27 марта 2012

Попробуйте это:

$Debug = $psboundparameters.debug.ispresent


if ($Debug){
  Write-Debug(string.Format("Name : {0}", api.GetName(myobj))
  }
2 голосов
/ 29 декабря 2013

Просто проверить, установлен ли флаг -Debug, можно с помощью приведенного ниже кода, но этого недостаточно.

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

PowerShell также позволяет вам установить глобальный флаг с именем $ DebugPreference, который приведенный выше код не проверяет. И вызов командлета из другого командлета наследует эти общие параметры, которые не наследуются через флаг отладки, как проверяет код выше. Код ниже проверит $ DebugPreference и решит эти проблемы.

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

К сожалению в отличие от командлета в 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; 
2 голосов
/ 29 марта 2012

Эксперимент показывает, что вы можете посмотреть на переменную $ DebugPreference.Я пробовал это с расширенными функциями, но, вероятно, он работает так же хорошо в командлете.

Попробуйте следующую последовательность команд:

function f { [cmdletbinding()]Param() $DebugPreference }
function g { [cmdletbinding()]Param() f }
f
f -Debug
g
g -Debug
2 голосов
/ 28 марта 2012

Чтобы получить доступ к флагу отладки из C #, вы должны сделать то же самое, что предлагает mjolinor:

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

Однако обратите внимание, что вы можете указать параметр отладки со значением false:

MyCmdlet -Debug:$false

Для обработки этого случая вы, вероятно, захотите добавить что-то вроде этого (из PSCmdlet):

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

В C # BoundParameters - это словарь, поэтому вы также можете использовать TryGetValue (), но учтите, что значение параметра (например, Debug) - это SwitchParameter, а не bool.

для получения дополнительной информации см. Следующее:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...