Как использовать переменную PowerShell в качестве командного параметра?

#variables #powershell #parameters

#переменные #powershell #параметры

Вопрос:

Я пытаюсь использовать переменную в качестве параметра команды, но не могу в этом разобраться. Допустим, MyCommand примет два параметра: option1 и option2 , и они принимают логические значения. Как бы я использовал $newVar для замены варианта 1 или 2? Например:

 $newVar = "option1"
MyCommand -$newVar:$true
  

Я продолжаю получать что-то вроде «Не удается найти позиционный параметр, который принимает аргумент»-System.Строковый параметр 1′.


Более конкретно:
Здесь CSV-файл является результатом другой политики. Цикл проходит по каждому свойству в файле и устанавливает это значение в моей политике как df; поэтому -$_.name:$_.value следует заменить как -AllowBluetooth:true .

 Import-Csv $file | foreach-object {
    $_.psobject.properties | where-object {
    # for testing I'm limiting this to 'AllowBluetooth' option
    if($_.name -eq "AllowBluetooth"){
    Set-ActiveSyncMailboxPolicy -Identity "asdf" -$_.name:$_.value
    }}
}
  

Комментарии:

1. Вы имеете в виду, newVar но неправильно вставили myVar ?

Ответ №1:

Обычно, чтобы использовать переменную для заполнения параметров командлета, вы бы использовали переменную хэш-таблицы и разделили ее, используя @

  $newVar = @{option1 = $true}
 mycommand @newVar
  

Добавлен пример:

 $AS_policy1 = @{
Identity = "asdf"
AllowBluetooth = $true
}

Set-ActiveSyncMailboxPolicy @AS_policy1
  

Комментарии:

1. Спасибо за помощь, но это возвращает ошибку «Не удается найти позиционный параметр, который принимает аргумент ‘System. Коллекции. Хэш-таблица’. В частности, у меня есть цикл для получения свойств properties из CSV и запуска их в Set-ActiveSyncMailboxPolicy. Для конкретного экземпляра я скажу $ _.name = «AllowBluetooth» и $_.value = $ true (я выписал эти переменные для подтверждения правильности значений. Однако я не могу собрать все это воедино Set-ActiveSyncMailboxPolicy -Identity "asdf" @{$_.name = $_.value} или -$_.name:$_.value . Хотя она принимает $ _.value просто отлично.

2. Смотрите редактирование. Если вы разделяете параметры, вы должны включить их все в хэш-таблицу.

3. Если кто-нибудь пытается использовать этот ответ, и пример у вас не работает, возможно, вы совершаете ту же ошибку, что и я, из-за недостатка внимания: используете переменную обычным способом, записывая, $AS_policy1 когда я должен был бы писать @AS_policy1 с помощью амперсанда «splatting».

Ответ №2:

Посмотрите, работает ли это для вас:

  iex "MyCommand -$($newVar):$true"
  

Комментарии:

1. Спасибо manojlds, это немного приблизило меня. Буквально, $newVar — это $ _.name, а $ true — это $_.value (что равно «Разрешить»). То, как я это делал, принимало $_.value в качестве значения, но не $ _.name в качестве параметра. При использовании вашего метода в качестве моего параметра принимается $_.name, но не $_.value в качестве значения… Не удается преобразовать значение «Система. Строка» для ввода [type]. Хотя я продолжу пробовать другие вещи.

2. Я заставил ваш метод работать, когда -$ ($newVar) хочет строку, но он не работает с логическими значениями, потому что он думает, что это строка. Я полагаю, это потому, что вся команда заключена в кавычки. Есть какие-нибудь указания?

3. @Fantabulum: iex "MyCommand -$($_.name):$($_.value)" тогда должно сработать по причине, которую я объяснил в своем ответе. 1 @manojlds.

Ответ №3:

У меня была такая же проблема, и я только что узнал, как ее решить. Решение заключается в использовании invoke-Expression: invoke-Expression $mycmd Это использует строку $ mycmd, заменяет переменные и выполняет ее как командлет с заданными параметрами

Ответ №4:

В настоящее время, если вы не возражаете против оценки строк как команд, вы можете использовать Invoke-Expression :

 $mycmd = "MyCommand -$($newVar):$true"
Invoke-Expression $mycmd
  

Ответ №5:

Я бы попробовал с:

$mycmd = "MyCommand -$($newVar): $true"
amp; $mycmd

Результат

Не может работать, потому что оператор амперсанда выполняет только отдельные команды без праметров или блоков скрипта.

Комментарии:

1. Спасибо за предложение, empo, но, похоже, это работает так же, как и мой оригинал. Я могу опубликовать отрывок из моего фактического сценария, если это поможет, но он включает в себя несколько циклов и команд Exchange, поэтому я думаю, что это просто вызовет путаницу.