Формат выходного файла PowerShell [дубликат]




  
  
  JS Bin


  
  

    

----------------- JS-код ------------

var targetDiv = document.getElementById('content');
    var htmlContent = '';

    function populateData(event){
      switch(event.target.value){
        case 'A':{
         htmlContent = 'Content for A';
          break;
        }
        case 'B':{
          htmlContent = "content for B";
break;
        }
      }
      targetDiv.innerHTML = htmlContent;
    }

Step1: on click of the radio button it calls function populate data, with event (an object that has event details such as name of the element, value etc..);

Step2: I extracted the value through event.target.value and then simple switch will give me freedom to add custom text.

Live Code

https://jsbin.com/poreway/edit?html,js,output

89
задан Peter Mortensen 8 February 2016 в 13:10
поделиться

3 ответа

Я думаю, вы могли бы использовать параметр ExpandProperty в Select-Object.

Например, чтобы получить список текущего каталога и просто отобразить свойство Name, следующее:

ls | select -Property Name

Это все еще возвращает объекты DirectoryInfo или FileInfo. Вы всегда можете проверить тип, проходящий через трубопровод, по трубопроводу до Get-Member (псевдоним gm).

ls | select -Property Name | gm

Итак, чтобы развернуть объект должен быть типом свойства, которое вы ищете, вы можете сделать следующее:

ls | select -ExpandProperty Name

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

$objects = ls | select -ExpandProperty Name
157
ответ дан Peter Mortensen 20 August 2018 в 22:49
поделиться

В дополнение к ранее имеющимся полезным ответам с указанием того, когда использовать этот подход и сравнение производительности.

  • Вне конвейера используйте:
    $objects.Name
    (PSv3 +), как показано в ответе rageandqq , который синтаксически проще и намного быстрее. Доступ к свойству на уровне коллекции для получения значений членов в качестве массива называется перечислением членов и является функция PSv3 + ; Компромиссы: как входной массив сбора, так и выходной массив должны вписываться в память в целом . Если входная коллекция сама является результатом команды (конвейера) (например, (Get-ChildItem).Name), эта команда должна сначала выполняться до завершения до того, как будут доступны элементы результирующего массива.
  • В конвейере , где результат должен быть обработан дальше или результаты не помещаются в память в целом, используйте:
    $objects | Select-Object -ExpandProperty Name
    . Необходимость в -ExpandProperty объясняется в ответ Скотта Саада . Вы получаете обычные преимущества конвейера от обработки по одному, что, как правило, дает выход сразу и сохраняет постоянство памяти (если вы в конечном итоге не собираете результаты в памяти). Компромисс: использование трубопровода сравнительно медленное .

Для коллекций ввода small (массивы) вы, вероятно, не заметите разницы и, особенно в командной строке, иногда можете ввести команду легко становится более важным.


Вот простая альтернатива, которая, однако, является самым медленным ; он использует упрощенный синтаксис , называемый оператором (опять же, PSv3 +):; например, следующее решение PSv3 + легко добавляется к существующей команде:

$objects | % Name      # short for: $objects | ForEach-Object -Process { $_.Name }

Для полноты: малоизвестный оператор коллекции PSv4 + .ForEach() - еще одна альтернатива:

# By property name (string):
$objects.ForEach('Name')

# By script block (much slower):
$objects.ForEach({ $_.Name })
  • Этот подход похож на перечисление участника (те же компромиссы), за исключением более медленного (хотя все же заметно быстрее, чем конвейер).
  • Для извлечения единственного значения свойства значением name ( string ) это решение находится на одном уровне с перечислением членов (хотя последнее синтаксически проще).
  • Вариант script-block , хотя и намного медленнее, допускает произвольные преобразования ; это более быстрый вариант «все-в-памяти-в-одном», альтернативный командному коду ForEach-Object .

Сравнение производительности различных подходов

Ниже приведены временные интервалы выборки для различных подходов на основе входного набора объектов 100,000; абсолютные цифры не важны и варьируются в зависимости от многих факторов, но это должно дать вам представление о относительном :

Approach                                          Seconds
--------                                          -------
 $objects.ForEach('Number')                       0.060
 $objects.Number                                  0.065
 $objects | Select-Object -ExpandProperty Number  0.859
 $objects.ForEach({ $_.Number })                  1.008
 $objects | % Number                              4.380
  • Самый быстрый на основе трубопровода решение более чем в 10 раз медленнее, чем решения для коллекции-оператора на основе перечисления / свойства-имени.
  • Использование для блока сценария на каждой итерации резко замедляет работу, так что самое быстрое решение на основе трубопроводов (Select-Object -Expand) превосходит коллекцию-operat [-g39] [-40] % Number на основе сценария
  • % Number, которая является наихудшим из обоих миров: конвейер, который использует блок сценария на каждой итерации (как указано, % Number является эквивалентом % { $_.Number }).

Примечание. Интересно, что с тем же тестом в PowerShell Core v6.0.2 на macOS дает другое ранжирование (хотя основное наблюдение за тем, что все еще более медленные конвейеры все еще применяются): перечисление членов происходит быстрее, и даже решение на основе сценария .ForEach() заметно быстрее, чем Select-Object -ExpandProperty.


Исходный код f или тестов:

# Number of input objects to create.
$count = 1e5 # 100,000

# Create sample input objects.
$objects = 1..$count | % { [pscustomobject] @{ Number = $_ } }

# An array of script blocks with the various approaches.
$approaches = { $objects | Select-Object -ExpandProperty Number },
              { $objects | % Number },
              { $objects.ForEach('Number') },
              { $objects.ForEach({ $_.Number }) },
              { $objects.Number }

# Time the approaches and sort them by execution time (fastest first):
$approaches | % {
    $scriptBlock = $_
    Measure-Command $scriptBlock |
      Select-Object @{ n='Approach'; e = { $scriptBlock.ToString() } } , Ticks
} | 
    Sort-Object Ticks | 
      Format-Table Approach, @{ n = 'Seconds'; e = { '{0:N3}' -f ($_.Ticks / 1e7) } }
7
ответ дан Mark Schultheiss 20 August 2018 в 22:49
поделиться

В качестве еще более простого решения вы можете просто использовать:

$results = $objects.Name

Который должен заполнить $results массивом всех значений свойств «Имя» элементов в $objects.

49
ответ дан rageandqq 20 August 2018 в 22:49
поделиться
  • 1
    Аккуратный трюк. Благодаря! – Igor Pashchuk 10 April 2015 в 20:35
  • 2
    Обратите внимание, что это не работает в Exchange Management Shell. При использовании Exchange нам нужно использовать $objects | select -Property Propname, OtherPropname – Bassie 2 August 2016 в 14:03
  • 3
    @Bassie: доступ к свойству на уровне коллекции для получения значений его членов как массива называется перечислением участников и является функцией PSv3 + ; предположительно, ваша консоль управления Exchange - это PSv2. – mklement0 20 February 2018 в 13:00
Другие вопросы по тегам:

Похожие вопросы: