Powershell convertfrom-string автоматически преобразует десятичную дробь в даты. Как мне это предотвратить?

#string #powershell #string-parsing

#строка #powershell #синтаксический анализ строк

Вопрос:

Я пытаюсь преобразовать данные из cli в объект powershell с помощью ConvertFrom-String, однако, когда я делаю это, десятичные числа автоматически анализируются как даты (как показано в столбце P4 ниже). Как мне это предотвратить?

plesk bin php_handler --list | ConvertFrom-String | select P2,P4,P11 | where{$_.P11 -like 'enabled'}

 
P2          P4                   P11    
--          --                   ---    
fastcgi-5   5/2/2017 12:00:00 AM enabled
fastcgi-5.3 5/3/2029 12:00:00 AM enabled
fastcgi-5.4 5/4/1945 12:00:00 AM enabled
fastcgi-5.5 5/5/1938 12:00:00 AM enabled
fastcgi-5.6 5/6/1940 12:00:00 AM enabled
fastcgi-7.0 7.0.33               enabled
fastcgi-7.1 7/1/1930 12:00:00 AM enabled
isapi-5     5/2/2017 12:00:00 AM enabled

  

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

1. Трудно быть точным, не зная, как выглядит ввод, но вы можете использовать шаблон с аннотациями, чтобы указать, к какому типу данных относится каждое свойство: learn.microsoft.com/en-us/powershell/module /…

Ответ №1:

Вам нужно будет либо использовать шаблон, либо манипулировать свойством с помощью вычисляемого свойства, если вы собираетесь использовать ConvertFrom-String :

Использование вычисляемого свойства:

 plesk bin php_handler --list | ConvertFrom-String |
    Select-Object P2,@{n='P4';e={if ($_.P4 -is [datetime]) { $_.P4.ToString('M.d.yyyy')} else {$_.P4}}},P11 |
        Where P11 -eq 'enabled'
  

Вы можете использовать другой подход и вместо этого использовать Foreach-Object с пользовательскими свойствами:

 plesk bin php_handler --list | Where {$data = -split $_; $data[10] -eq 'enabled'} |
    Foreach-Object { [pscustomobject]@{P1=$data[0];P4=$data[3];P11=$data[10]} }
  

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

 function ConvertTo-MyObject {
    param([parameter(ValueFromPipeline)]$InputObject)
    process {
        $i = 1
        $hash = [ordered]@{}
        -split $input | Foreach-Object { $hash[$("P" $i  )] = $_ }
        [pscustomobject]$hash
    }
}

plesk bin php_handler --list | ConvertTo-MyObject |
    Where P11 -eq 'enabled' | Select P2,P4,P11