none
Замена текста, в строке. RRS feed

  • Вопрос

  • Добрый вечер, Форумчане.

    Подскажите, пожалуйста. Пытаюсь реализовать форматирование таблицы в html. Задача такая, что необходимо в текстовом столбце, все числовые значения которые больше 5, выделять красным цветом. Но если использовать оператор сравнения -gt, то он выделяет значения лишь по первым цифрам. Предполагаю что необходимо делать замену с помощью -replace. Помогите, пожалуйста реализовать, такое, с колонкой Size. С колонкой Powerstate удалось решить: 

    foreach {$PSItem -replace "<td>PoweredOn</td>", "<td style='background-color:#FF8080'>PoweredOn</td>"}


    • Изменено new guy 1 17 августа 2020 г. 19:31
    17 августа 2020 г. 19:30

Ответы

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

    смысла писать регексп для определиня числа в строке большего чем 5 не вижу смысла, поэтому проще работать с числами (имхо)

    $Report = $Report | Select Name,Description,Size,Created,Powerstate | `
        ConvertTo-Html -Head $Header -PreContent "<p>Вы получили это письмо, т.к. являетесь владельцем виртуальной машины, у которой $text $path</p><p>Снимки состояния негативно влияют на производительность виртуальной машины, а также отнимают большой объем пространства на дисковых хранилищах, поэтому хорошей практикой является удаление снимка состояния, когда в нем нет необходимости. Кроме того, снимки состояния рекомендуем создавать без оперативной памяти виртуальной машины (снимать галочку snapshot the virtual machine's memory), столбец Powerstate в таблице. <br>Просим вас $text1, либо сообщить причину, по которой $text2.<br>Ниже перечень снимков состояний этой виртуальной машины:</p>" -PostContent "<p id='CreationDate'>Creation Date: $(Get-Date)</p>", "<p>С уважением, <br>IT</p>" | `
    foreach {
        $cLine = $PSItem
        $cLine = $cLine -replace "<td>PoweredOn</td>", "<td style='background-color:#FF8080'>PoweredOn</td>"
        $cLine = $cLine -replace "<td>PoweredOff</td>", "<td style='background-color:#16C60C'>PoweredOff</td>"
            if ($cLine -match '<td>(?''RealSizeGB''\d+([\.\,]\d+)?) GB</td>'){
                [string]$RealSizeGB = $Matches['RealSizeGB']
                [float]$RealSizeGB = $RealSizeGB -replace ',','.'
             if ($RealSizeGB -gt 5){
                  $cLine = $cLine -replace '<td>(\d+([\.\,]\d+)? GB)</td>','<td style=''background-color:#16C60C''>$1</td>'
            }
        }
        $cline
    } | Out-String

    Для решения проще можно просто оставить SizeGB вместо конвертации в Size в таком случае ваш код лолжен работать без модификаций

    Ванлайнеры на сотни знаков крайне сложно читать, поэтому рекоммендую использовать переносы строк

    2 foreach не нужны, все преобразования можно сделать в одном

    $text, $text1 и $text2 смотрятся довольно нетривиально учитывая что вы пол страницы текста пишите в одну строку и 7-10 слов выделяете в переменные


    The opinion expressed by me is not an official position of Microsoft



    • Изменено Vector BCOModerator 18 августа 2020 г. 21:43
    • Помечено в качестве ответа new guy 1 20 августа 2020 г. 7:56
    18 августа 2020 г. 21:10
    Модератор

Все ответы

  • вы забыли опубликовать тестовые данныне и скрипт который хотите править

    все будет работать корректно с -gt если работать с числом а не со строкой



    The opinion expressed by me is not an official position of Microsoft

    17 августа 2020 г. 19:50
    Модератор
  • Добрый вечер. Прикладываю скрипт.

    • Изменено new guy 1 20 августа 2020 г. 7:57
    17 августа 2020 г. 20:41
  • Добрый вечер.

    Осталось реализовать, лишь, выделение размера, в столбце Size. Этот стобец к сожалению, не числовой, а строковый, в нем есть информация о размере (GB). Как пример, выше на скриншоте, задано выделить все значения выше 5, то что красным он выделил верно, так как первые цифры выше 5, а то что выделено желтым цветом, то упущено, потому что первая цифра меньше 5, но не учтена цифра после первой и до запятой. Каким образом можно реализовать так, чтобы было выделение всех чисел , что больше, например 5, и пусть до бесконечности, в строком типе данных ? В скрипте что опубликовал выше, я добавил реализацию от Martin Pugh в виде функции set-cellcolor, мощная и удобная, но к сожалению в моем случае, тоже, не особо помогла. Подскажите, пожалуйста, что можно придумать в данном случае... Буду признателен.


    • Изменено new guy 1 18 августа 2020 г. 19:26
    18 августа 2020 г. 17:20
  • функция для перекраски ячеек использовалась аж 1 раз и не работала так как вы ожидали, поэтому не вижу в ней огромного смысла

    смысла писать регексп для определиня числа в строке большего чем 5 не вижу смысла, поэтому проще работать с числами (имхо)

    $Report = $Report | Select Name,Description,Size,Created,Powerstate | `
        ConvertTo-Html -Head $Header -PreContent "<p>Вы получили это письмо, т.к. являетесь владельцем виртуальной машины, у которой $text $path</p><p>Снимки состояния негативно влияют на производительность виртуальной машины, а также отнимают большой объем пространства на дисковых хранилищах, поэтому хорошей практикой является удаление снимка состояния, когда в нем нет необходимости. Кроме того, снимки состояния рекомендуем создавать без оперативной памяти виртуальной машины (снимать галочку snapshot the virtual machine's memory), столбец Powerstate в таблице. <br>Просим вас $text1, либо сообщить причину, по которой $text2.<br>Ниже перечень снимков состояний этой виртуальной машины:</p>" -PostContent "<p id='CreationDate'>Creation Date: $(Get-Date)</p>", "<p>С уважением, <br>IT</p>" | `
    foreach {
        $cLine = $PSItem
        $cLine = $cLine -replace "<td>PoweredOn</td>", "<td style='background-color:#FF8080'>PoweredOn</td>"
        $cLine = $cLine -replace "<td>PoweredOff</td>", "<td style='background-color:#16C60C'>PoweredOff</td>"
            if ($cLine -match '<td>(?''RealSizeGB''\d+([\.\,]\d+)?) GB</td>'){
                [string]$RealSizeGB = $Matches['RealSizeGB']
                [float]$RealSizeGB = $RealSizeGB -replace ',','.'
             if ($RealSizeGB -gt 5){
                  $cLine = $cLine -replace '<td>(\d+([\.\,]\d+)? GB)</td>','<td style=''background-color:#16C60C''>$1</td>'
            }
        }
        $cline
    } | Out-String

    Для решения проще можно просто оставить SizeGB вместо конвертации в Size в таком случае ваш код лолжен работать без модификаций

    Ванлайнеры на сотни знаков крайне сложно читать, поэтому рекоммендую использовать переносы строк

    2 foreach не нужны, все преобразования можно сделать в одном

    $text, $text1 и $text2 смотрятся довольно нетривиально учитывая что вы пол страницы текста пишите в одну строку и 7-10 слов выделяете в переменные


    The opinion expressed by me is not an official position of Microsoft



    • Изменено Vector BCOModerator 18 августа 2020 г. 21:43
    • Помечено в качестве ответа new guy 1 20 августа 2020 г. 7:56
    18 августа 2020 г. 21:10
    Модератор
  • Добрый день, Vector BCO.

    Большое спасибо за рекомендации и помощь. Как всегда все работает как часы !

    20 августа 2020 г. 7:56