Передача всех общих переменных в команду вызова

Недавно я загружал функции и сценарии PowerShell, которые я считаю полезными, и оборачивал их в команды вызова, чтобы сделать их более полезными в моей сети. Одна вещь, которую я не понял, это как принять общие параметры из [cmdletBinding()] и передать их все в команду вызова. Я знаю, как передавать отдельные переменные предпочтений, но не все из них. Существует ли общий набор переменных? Ниже приведены некоторые выдержки из PowerShell для иллюстрации.

ScriptBlock =
{   #How do I pass the whole of the common variables?
    $ErrorActionPreference=$using:ErrorActionPreference
    $InformationPreference=$Using:InformationPreference
    $VerbosePreference=$Using:VerbosePreference...

Process
{
    Write-Verbose "Processing"
    $computername=$name
    #Used $Name as a parameter originally to be compatible with the get-adcomputer cmdlet
    If ($Credential) {Invoke-Command -ComputerName $computername -Credential $Credential -ScriptBlock $ScriptBlock}
    Else {Invoke-Command -ComputerName $computername -ScriptBlock $ScriptBlock}
    #You will need to be running Powershell with the proper Admin privileges if you don't specify a credential
} #End Process
  END{

person M. Anselmi    schedule 24.10.2016    source источник


Ответы (1)


Вы можете получить его из хеш-таблицы $PSBoundParameters.

$VerbosePreference=$PSBoundParameters['Verbose']
$ErrorActionPreference=$PSBoundParameters['ErrorAction']

РЕДАКТИРОВАТЬ:

Вы также можете добавить эти стандартные параметры к своим командлетам.

Invoke-Command -scriptblock $scriptblock @PSBoundParameters
person AtomicFireball    schedule 24.10.2016
comment
Первый вариант не выглядит лучше, чем то, что я делаю сейчас. - person M. Anselmi; 25.10.2016
comment
Второй вариант ближе к тому, что я ищу. Тем не менее, он выдает ошибку, когда я его использую. Я думаю, что это сработает только в том случае, если все мои параметры будут соответствовать ожиданиям команды вызова. Я прав? - person M. Anselmi; 25.10.2016
comment
Да, это было бы правдой. Вы также можете создать собственную хэш-таблицу для хранения ваших переменных и разбить их там, где вам нужно. Вы можете создать его программно с помощью [System.Management.Automation.Cmdlet]::CommonParameters - person AtomicFireball; 25.10.2016
comment
Это сработало! С небольшой доработкой моего скрипта я заставил это работать. Ты сделал мой сценарий таким сексуальным. Ей будут завидовать все остальные сценарии. - person M. Anselmi; 25.10.2016
comment
Потрясающий! Пожалуйста, не забудьте отметить мой ответ полезным, если он работает для вас. - person AtomicFireball; 25.10.2016
comment
Я говорил слишком рано. Когда я удалил объявление $using:$x моих переменных предпочтений, мой подробный вывод исчез. - person M. Anselmi; 25.10.2016
comment
Я упускаю что-то очевидное? - person M. Anselmi; 25.10.2016
comment
Нужно ли использовать $using:@PSBoundParameters или что-то подобное? - person M. Anselmi; 25.10.2016
comment
Знак @ — это знак знака. Это принимает ключи хеш-таблицы как именованные параметры и их значения в командлет. Как я уже сказал, вы можете создать собственную хеш-таблицу, если не хотите передавать какие-либо другие параметры, или статическое свойство System.Management.Automation.Cmdlet]::CommonParameters позволит вам извлечь их в простом цикле foreach. - person AtomicFireball; 25.10.2016
comment
Похоже, что @psboundparameter содержит только те параметры, которые я явно определил в своей функции. Похоже, он не несет в себе то, что вы получаете от [cmdletbinding()], например, переключатели -verbose и -debug. Это то, что я надеялся передать в свой скриптовый блок, не переопределяя все эти переменные. Вы спасли меня от этого уродливого оператора if в моем разделе «Процесс». - person M. Anselmi; 25.10.2016
comment
blogs.msdn.microsoft .com/робкий/2014/08/12/ - person AtomicFireball; 25.10.2016
comment
Спасибо. Вы ответили на мой вопрос. Это был не тот ответ, который я искал, но он был мне нужен. Видимо, я не могу сделать это в том виде, в котором оно есть сейчас. Мне нужно воссоздать каждый параметр в моем блоке сценария, который я хочу использовать повторно. - person M. Anselmi; 25.10.2016
comment
Я хотел отметить ваш ответ. Однако мой уличный авторитет явно недостаточно хорош. Извиняюсь. - person M. Anselmi; 09.06.2017