Я написал 2 командлета для преобразования между GUID и эквивалентом Oracle Guid, строк, которые он отображает для столбцов RAW, используемых для хранения GUID. Первый, Convert-GuidToRaw
, принимает строковый параметр GUID и выводит необработанную строку:
var raw = GuidConverter.Core.GuidConverter.ToRaw(Input);
WriteObject(raw);
Где raw
имеет тип string
. Когда я запускаю этот командлет, я получаю простой и простой вывод строки:
PS D:\SANRAL\NRA2> New-Guid | Convert-GuidToRaw
DD8386EE09231A43B7731880CCAD6B87
PS D:\SANRAL\NRA2>
Мой другой командлет, Convert-RawToGuid
, принимает строковый параметр RAW, представляющий GUID, и выводит необработанный GUID:
var guid = GuidConverter.Core.GuidConverter.FromRaw(Input);
WriteObject(guid);
Где guid
имеет тип Guid
. Когда я запускаю этот командлет, я получаю вывод в формате таблицы:
PS D:\SANRAL\NRA2> Convert-RawToGuid DD8386EE09231A43B7731880CCAD6B87
Guid
----
ee8683dd-2309-431a-b773-1880ccad6b87
PS D:\SANRAL\NRA2>
В обоих случаях я выводю один объект, а не список, и в обоих случаях объект легко представляется простой строкой. Почему я получаю табличный вывод при возврате типа Guid
?
Возможно, стоит отметить, что командлет Convert-GuidToRaw
с его простым, неформатированным строковым выводом выглядит неправильно написать в конвейер. Оба командлета принимают один параметр из конвейера. Я ожидал бы, что этот конвейер командлетов ниже выведет GUID, когда вместо этого последний командлет в конвейере пока ищет ввод:
PS C:\WINDOWS\system32> New-Guid | Convert-GuidToRaw | Convert-RawToGuid
cmdlet Convert-RawToGuid at command pipeline position 3
Supply values for the following parameters:
Input:
Почему Convert-RawToGuid
не получает "конвейерную" строку из Convert-GuidToRaw
? Переключение порядка конвейера, как показано ниже, приводит к ожидаемому поведению:
PS C:\WINDOWS\system32> Convert-RawToGuid F3BD9411DE8E4F4BBCACECFCED6D305D | Convert-GuidToRaw
F3BD9411DE8E4F4BBCACECFCED6D305D
PS C:\WINDOWS\system32>
Командлет Convert-RawToGuid
выглядит следующим образом:
[Cmdlet(VerbsData.Convert, "RawToGuid")]
public class ConvertRawToGuidCommand : System.Management.Automation.Cmdlet
{
[Parameter(Mandatory = true, Position = 1, ValueFromPipeline = true)]
public string Input { get; set; }
protected override void ProcessRecord()
{
if (string.IsNullOrEmpty(Input) || Input.Length != 32)
{
throw new ArgumentException("Input must be a 32 character hex string");
}
var guid = GuidConverter.Core.GuidConverter.FromRaw(Input);
WriteObject(guid);
}
}
Командлет Convert-GuidToRaw
выглядит следующим образом:
[Cmdlet(VerbsData.Convert, "GuidToRaw")]
public class ConvertGuidToRawCommand : System.Management.Automation.Cmdlet
{
[Parameter(Mandatory = true, Position = 1, ValueFromPipeline = true)]
public Guid Input { get; set; }
protected override void ProcessRecord()
{
var raw = GuidConverter.Core.GuidConverter.ToRaw(Input);
WriteObject(raw);
}
}