Моего командлет имеет Get-Deal
команду, которая будет получать значения из трубопровода:Командлета говорит параметр не может быть получен: выражение должно быть читаемым
[Cmdlet(VerbsCommon.Get, "Deal")]
public class GetDealCmdlet : InsightBaseCmdlet
{
private List<Object> _legalentities = new List<Object>();
[Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true,ValueFromPipelineByPropertyName = true)]
public List<Object> Legalentity { set { _legalentities = value; } }
protected override void ProcessRecord() {...}
}
Он отлично работает, если я передал список строки или других типов. Однако, если я передал объект, который создается в Search-Deal
:
foreach (...)
{
PSObject dealValue = new PSObject();
dealValue.Properties.Add(new PSNoteProperty(Legalentity,Convert.ToInt32($deal.Properties["LegalEntityID"].Value.ToString())));
dealValue.Properties.Add(new PSNoteProperty("Name",deal.Properties["name"].Value.ToString()));
WriteObject(dealValue);
}
Я получаю сообщение об ошибке:
Pipeline input cannot be processed because the default value of parameter 'Legalentity' cannot be retrieved. Exception getting 'Legalentity' : expression must be readable Parameter Name: expression
Я уверен, что search-Deal
работает нормально, потому что
$a = Search-Deal name
работает. И предоставление:
Get-Deal $a
возвращает точный результат, который я хочу.
Однако
$a | Get-Deal
выдаст ошибку одним и тем же тоже.
EDIT: использованием
Trace-Command -Name ParameterBinding -Expression { Search-Deal JL | Get-Deal } -PSHost
я нашел следующее:
CALLING BeginProcessing
BIND PIPELINE object to parameters: [Get-Deal]
PIPELINE object TYPE = [System.Management.Automation.PSCustomObject]
RESTORING pipeline parameter's original values
BIND PIPELINE object to parameters: [Out-Default]
PIPELINE object TYPE = [System.Management.Automation.ErrorRecord]
Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION
BIND arg [Pipeline input cannot be processed because the default value of parameter 'LegalEntity' cannot be retrieved. Exception getting "LegalEntity": "Expression must be readable Parameter name: expression"]
Так что я думаю, что это должно быть что-то не так с трубопровода передачи объектов.
Спасибо за помощь!
Переименовано в сингулярное :) Чтобы быть более конкретным, объект поиска-сделки записывает объект в цикл: foreach() {PSObject dealValue = новый PSObject(); ... WriteObject (dealValue);}, поэтому он передает один объект за раз. также Get-Deal может взять список (который сохраняет возможность передавать переменную списка в параметр вместо конвейерной обработки, как показано), но в случае с конвейером я думаю, что он занимает один объект за раз из предыдущего цикла. Я попробовал, $ a | Get-Deals, но, похоже, не работает, хотя ... – jamesdeath123
Я должен был прочитать это неправильно в первый раз. Во всяком случае: я бы проверял «Trace-Command -Name ParameterBinding» - ясно, что что-то в связующем значении параметра вызывает эту проблему, поэтому больше информации о трассировке может быть полезна. Я вижу свойство, которое соответствует параметру в выходном объекте Search-Deal, возможно, это вызывает эту проблему? И последнее, но не менее важное: я вижу '$ deal' внутри' ToInt32', разве это не будет 'сделка' ...? – BartekB
$ deal - это еще один PSObject, который Search-deal принимает идентификатор и передает его в конвейер как свойство dealValue. Я как бы делаю это $ deal, чтобы определить, что это переменная :) Я не знаком с Trace-Command, и я использовал: Trace-Command -Name ParameterBinding {Search-Deal JL | Get-Deal} и та же ошибка. Не могли бы вы рассказать мне, как мне использовать Trace-Command? Кроме того, вы упомянули свойство, которое соответствует параметру в выходном объекте Search-Deal, и это может вызвать проблему. Я попытался переименовать имя параметра Get-Deal, но здесь не очень помогает. – jamesdeath123