Вот тестовый сценарий, который я пытаюсь использовать, вызываю его из отдельного процесса и пытаюсь передать ему параметры. Идея состоит в том, что у меня есть пользовательский интерфейс, который позволяет пользователю выбрать CmdLet, а затем заполнить другое раскрывающееся меню со свойствами / методами этого CmdLet.

Моя проблема, похоже, заключается в том, что сценарий отображает входной параметр в виде строки и, таким образом, создает текстовый файл с методами и свойствами любой произвольной строки, к которой вы применили «Get-Member», например « Clone »или« CompareTo ». Единственное свойство как таковое - «Длина».

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

param([string]$inputCmdLet = "Get-NetAdapter");

$wrkgDir = "D:\Distribution\Operational";

# Get Properties and Methods for CmdLet Input Parameter
$propertyNames = $inputCmdLet | Get-Member -MemberType Property;
$methodNames = $inputCmdLet | Get-Member -MemberType Method;

# Sort Arrays
$propertyNames = $propertyNames | Sort-Object Name;
$methodNames = $methodNames | Sort-Object Name;

# Output Results to Text Files
$propertyNames.Name | Out-File $wrkgDir\$inputCmdLet.Properties.txt;
$methodNames.Name | Out-File $wrkgDir\$inputCmdLet.Methods.txt;

ИЗМЕНИТЬ ДОПОЛНИТЕЛЬНУЮ ИНФОРМАЦИЮ:

Результатом, на который я надеюсь, в примере Get-NetAdapter будет список свойств в одном выходном файле и методов в другом. Теперь я получаю следующее:

Левый список - ожидаемый (частичный) результат, правый список - фактический результат.

Я не уверен, как программно получить список результатов слева (на изображении). Я могу получить правильный результат, набрав его статически:

$mbrNameStatic = Get-NetAdapter | Get-Member;
$mbrNameStatic.Name | Out-File $wrkgDir\$inputCmdLet.Strings.txt;

Но когда я использую входной параметр, он объединяет значение в виде строки, поэтому кажется, что фактический код времени выполнения выглядит примерно так:

$propertyNames = "Get-NetAdapter" | Get-Member -MemberType Property;

Таким образом, добавление кавычек отображает командлет в виде строки (я полагаю, это имеет смысл, поскольку мой входной параметр является строкой), которая возвращает свойства и методы строки вместо командлета. Есть ли способ отобразить командлет без кавычек?

Пожалуйста, дайте мне знать, если я не понимаю этого, ни с моим описанием, ни с идеей в целом.

Благодарность!

1
africo 3 Дек 2017 в 05:56

1 ответ

Лучший ответ

Чтобы выполнить команду, имя (только) которой хранится в переменной или имя которой указано в одинарных или двойных кавычках, вы должны использовать &, оператор вызова < / em>.

# WRONG: The token is interpreted as an *expression* that outputs a *string*
"Get-NetAdapter"  # outputs the [string] literal

# WRONG: ditto, via a variable
$name = "Get-NetAdapter"
$name  # outputs the contents of the [string] variable

# OK: Use of & tells Powershell to interpret the next token as a *command* to *invoke*.
& "Get-NetAdapter"
& $name

Что касается вашего общего подхода:

  • Обратите внимание, что не все командлеты производят вывод при вызове без параметров , поэтому ваш текущий код (даже с &) не будет работать со всеми командлетами.

  • И наоборот, те командлеты, которые действительно производят вывод, когда не заданы параметры, могут создавать партию из них, что не является необходимым, поэтому подумайте о чем-то вроде & $inputCmdlet | Select-Object -First 1.

  • Как правило, вы можете использовать что-то вроде (Get-Command Get-NetAdapter).OutputType для получения типа (ов) вывода командлета, но учтите, что:

    • Объявление типов вывода является необязательным , поэтому не все командлеты могут возвращать значение.

    • Если вы начнете с оценщика типа , а не с экземпляра этого типа, вы не сможете использовать Get-Member для обнаружения членов экземпляра (вы можете получить статические члены только через -Static).

0
mklement0 3 Дек 2017 в 20:29