none
Получение нужных значений их переменной RRS feed

  • Вопрос

  • Доброго времени суток.

    Есть вывод команды:

    Файлов :        12         0        12         0         0         0

    Цифры в столбцах могут быть разные, но их всегда 6, как мне получить вторую и последнюю цифру?

    Заранее спасибо

    4 августа 2016 г. 16:07

Ответы

Все ответы

  • Для таких задач существуют регулярные выражения.

    Конкретно в вашем случае:

    1. Записываете результат в переменную, например $str
    2. Вызываете выполнение регулярного выражения: $str -match 'Файлов :( |\t)+(\d+)( |\t)+(\d+)( |\t)+(\d+)( |\t)+(\d+)( |\t)+(\d+)( |\t)+(\d+)'|Out-Null
    3. Нужные вам значения - в элементах массива $matches[4] и $matches[12]

    Слава России!

    4 августа 2016 г. 17:12
  • Приведите лучше  полный скрипт.

    PS > ("Файлов :        12         0        12         0         0         0" -split "\s+")[3,-1]
    0
    0


    • Изменено KazunEditor 4 августа 2016 г. 17:20
    • Помечено в качестве ответа Omni_Vidente 4 августа 2016 г. 18:37
    4 августа 2016 г. 17:16
    Отвечающий
  • $str="Файлов: 12 0 12 0 0 0"
    $str1 = $str.Split(" ")
    $str1[2]
    $str1[6]

    4 августа 2016 г. 17:59
  • Приведите лучше  полный скрипт.

    PS > ("Файлов :        12         0        12         0         0         0" -split "\s+")[3,-1]
    0
    0


    в программе прогресс бар(Windows form) для JOB зеркалирования множества файлов:

    $global:totalcnt8 = (robocopy.exe "$sourcesSoft\" "$SelectedDrive\Sources" /MIR /ETA /L /NC /NP).length - 1


    Таких totalcnt десятки, провожу их суммирование  и далее вычисляю процент выполнения задания

    Param ($Job)
    $global:currentcnt += ($Job | Receive-Job).Count
    $percent = ($global:currentcnt / $global:totalcnt) * 100
    if ($percent -lt 100)
    {
        $progressbar1.Value = $percent
    }

    Так вот все хорошо, до тех пор пока в сравниваемых папках нет изменения, в этом случае Length дает число больше нуля, и прогресс бар в конце просто проскакивает, т.к. Job завершается. Поэтому я перед получением Totalcnt хочу проверить есть ли изменения в папке примерно так:

    $totalcnt8 = (robocopy.exe "$sourcesSoft\" "$SelectedDrive\Sources" /MIR /ETA /L /NC /NP)

    $totalcnt8[-5] -match '\s+(?<Count>\d+).*'

    тут я как раз и получаю строчку 

    Файлов :        12         0        12         0         0         0

    где 2ая цифра это количество файлов которое нужно добавить, а 6-ая это количество удаленных файлов из папки назначения. И тут уже в зависимости от значение мы либо присваиваем $Totalcnt8 значение 0, либо минусуем значение находящееся в 6 колонке (потому что удаление проходит мгновенно и я решил не учитывать его в прогресс бар), либо

    $global:totalcnt8 = (robocopy.exe "$sourcesSoft\" "$SelectedDrive\Sources" /MIR /ETA /L /NC /NP).length - 1

    Сам скрипт не выкладываю он очень большой

    ЗЫ я только учусь, поэтому красивости и правильности в моих скриптах не очень много :)

    ЗЫЗЫ получить значение общего размера файлов из job я так и не смог, знаний не хватает, поэтому остановился на таком варианте.



    • Изменено Omni_Vidente 4 августа 2016 г. 18:18
    4 августа 2016 г. 18:17
  • $str="Файлов: 12 0 12 0 0 0"
    $str1 = $str.Split(" ")
    $str1[2]
    $str1[6]

    Пробелов более 1 и как я понял их количество зависит от того сколько цифр в значении следующем за ними, т.е. к примеру в данном примере между 12 и 0 9 пробелов, а между 0 и 12 -8

    • Изменено Omni_Vidente 4 августа 2016 г. 18:47
    4 августа 2016 г. 18:34
  • PS > ("Файлов :        12         0        12         0         0         0" -split "\s+")[3,-1]
    0
    0

    Спасибо, этот вариант рабочий

    • Изменено Omni_Vidente 4 августа 2016 г. 18:48
    4 августа 2016 г. 18:37