Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск по тексту в txt с "если" (http://forum.oszone.net/showthread.php?t=334155)

zegordo 05-04-2018 11:24 2807126

Поиск по тексту в txt с "если"
 
Добрый день!

Есть текстовый файл со следующим содержанием, в котором состояние логического диска рейда.

Скрытый текст
Код:

CLI Version: 4.1.10.16  RaidAPI Version: 5.0.0.1061
Welcome to RAID Command Line Interface.

>
Virtual Disk Information
-------------------------
id:                  0
name:                MicroBox
status:              degraded
Stripe size:        64
RAID mode:          RAID1
Cache mode:          Off
size:                953789 M
BGA status:          running
Block ids:          0 4
# of PDs:            2
PD RAID setup:      0 1
Running OS:          yes
BGA progress:    rebuilding is 23% done


Total # of VD:      1

> Type 'exit' to exit CLI.
>



Выделенная строчка "BGA progress: rebuilding is 23% done" появляется только тогда, когда рейд восстанавливается.

Помогите пожалуйста составить батник со следующей логикой:

1. Если в тексте есть слово degraded, но нет rebuilding, выводить "0" (во всех вариантах вывод без кавычек)
2. Если есть rebuilding, выводить цифры без % из этой строки, в данном тексте вывод должен быть "23"
3. Если нет ни degraded, ни rebuilding, выводить "1"

Petya V4sechkin 05-04-2018 12:24 2807144

Цитата:

Цитата zegordo
2. Если есть rebuilding, выводить цифры без % из этой строки, в данном тексте вывод должен быть "23"
3. Если нет ни degraded, ни rebuilding, выводить "1"

При 1% неоднозначно получается (да и при 0% тоже).

zegordo 05-04-2018 12:43 2807150

Чёрт, а ведь вы правы.
Тогда лучше сделать возврат "2" во втором пункте, независимо от числа в строке. Т.е. если rebuilding есть - 2.

Казбек 05-04-2018 13:56 2807177

Цитата:

Цитата zegordo
Если есть rebuilding, выводить цифры без % из этой строки, в данном тексте вывод должен быть "23" »

А degraded при этом есть или нет?

Iska 05-04-2018 14:14 2807185

zegordo, а что Вам та же wmic.exe/WMI CIM Studio говорит в этот момент насчёт состояния массива (подходящие классы Вам самому поискать придётся)?

Цитата:

Цитата zegordo
Есть текстовый файл »

Как/откуда он берётся? Может, лучше будет зараз разбирать вывод утилиты напрямую (если сие возможно, конечно)?

zegordo 05-04-2018 14:42 2807198

Цитата:

Цитата Казбек
А degraded при этом есть или нет? »

есть, пример как раз под спойлером

Цитата:

Цитата Iska
Как/откуда он берётся? Может, лучше будет зараз разбирать вывод утилиты напрямую (если сие возможно, конечно)? »

с рейд-контроллером можно общаться через CLI
Скрытый текст


Текст в первом посте выдаётся командой "info -o -vd"

Ну а т.к. это cli, простой батник требует файла команд, результат которых и скидывает в .txt рядом

т.е. примерно так

Код:

c:\mvsetup.exe < c:\failcomand.txt > c:\resultat.txt

Цитата:

Цитата Iska
а что Вам та же wmic.exe/WMI CIM Studio говорит в этот момент насчёт состояния массива »

А никак, рейд хардварный, винда видит массив всегда стабильно работающим и не имеет доступа к дискам в нём

alpap 05-04-2018 15:18 2807205

так хватит?
Код:

@echo off
<file.txt (>nul find "degraded" && (
  for /f "delims=" %%a in ('find "rebuilding"') do for %%x in (%%a) do echo "%%x"|>nul findstr [0-9] && call echo %%x)
 )
)
pause


Iska 05-04-2018 16:16 2807218

Цитата:

Цитата zegordo
т.е. примерно так… »

Попробуйте выполнить в консоли:
Код:

echo info -0 -vd | c:\mvsetup.exe | find.exe /i /v ""
Будет вывод текста на консоль?

Общий вид предполагаю примерно таким:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

echo info -0 -vd | c:\mvsetup.exe | find.exe /i "degraded" && (
        echo info -0 -vd | c:\mvsetup.exe | find.exe /i "rebuilding" && (
                echo Status: Degraded and rebuilding
                exit /b 1
        ) || (
                echo Status: Degraded
                exit /b 2
        )
) || (
        echo Status: Successfull
        exit /b 0
)

endlocal
exit /b 0

При нормальном состоянии нулевой код возврата, при повреждённом — 1, при перестройке массива — 2.

Казбек 05-04-2018 16:29 2807220

Цитата:

Цитата zegordo
1. Если в тексте есть слово degraded, но нет rebuilding, выводить "0" (во всех вариантах вывод без кавычек)
2. Если есть rebuilding, выводить цифры без % из этой строки, в данном тексте вывод должен быть "23"
3. Если нет ни degraded, ни rebuilding, выводить "1" »

Код:

@echo off

>nul find "degraded" file.txt && >nul find "rebuilding" file.txt && (
echo 2
pause
)

>nul find "rebuilding" file.txt || >nul find "degraded" file.txt || (
echo 1
pause
)

>nul find "degraded" file.txt && (
echo 0
pause
)


zegordo 05-04-2018 16:50 2807225

Цитата:

Цитата alpap
так хватит? »

а зачем занулять? даже без этого, результат не даёт.

Цитата:

Цитата Iska
Будет вывод текста на консоль? »

FIND: Invalid switch написал только.
важно отметить, это hyper-v server 2016, возможно не хватает каких-то компонентов.

Соответственно ваш код даёт следующий результат:

Код:

CLI Version: 4.1.10.16  RaidAPI Version: 5.0.0.1061
Welcome to RAID Command Line Interface.

> -o : invalid object '-vd'
> info: option -o is required
> Ambiguous command 'in'!
> Ambiguous command 'i'!
> Type 'exit' to exit CLI.

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


Казбек, ваш вариант рабочий, только если есть и degraded и rebuilding выводит 2, потом 0 за одно исполнение

Iska 05-04-2018 17:00 2807228

Цитата:

Цитата zegordo
FIND: Invalid switch написал только. »

Что-то Вы не то скопировали, видимо.

Цитата:

Цитата zegordo
важно отметить, это hyper-v server 2016, возможно не хватает каких-то компонентов. »

Э… Это банальная командная строка, внешняя утилита, родная.

Что говорит:
Код:

find.exe /?
?

zegordo 05-04-2018 17:16 2807230

Цитата:

Цитата Iska
Что говорит: »

всё верно, как-то не так скопировал

теперь говорит

Код:

CLI Version: 4.1.10.16  RaidAPI Version: 5.0.0.1061
Welcome to RAID Command Line Interface.

> -o : invalid object '-vd'
> info: option -o is required
> Ambiguous command 'in'!
> Ambiguous command 'i'!
> Type 'exit' to exit CLI.

так же чуть ранее обновил пост предыдущий, после вашего нового сообщения. http://forum.oszone.net/post-2807225-10.html

Iska 05-04-2018 17:48 2807238

zegordo, а если так, напрямую:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

c:\mvsetup.exe info -0 -vd | find.exe /i "degraded" && (
        c:\mvsetup.exe info -0 -vd | find.exe /i "rebuilding" && (
                echo Status: Degraded and rebuilding
                exit /b 1
        ) || (
                echo Status: Degraded
                exit /b 2
        )
) || (
        echo Status: Successfull
        exit /b 0
)

endlocal
exit /b 0

?

Цитата:

Цитата zegordo
> -o : invalid object '-vd' > info: option -o is required »

Я брал отсюда:
Цитата:

Цитата zegordo
Текст в первом посте выдаётся командой "info -o -vd" »

Смотрите сами, что там должно быть, «-0» или «-o».

zegordo 05-04-2018 17:53 2807241

то выглядит так

Скрытый текст


и в конце ещё status: successful
если не зажимать мышкой

Казбек 05-04-2018 17:58 2807243

Цитата:

Цитата zegordo
Казбек, ваш вариант рабочий, только если есть и degraded и rebuilding выводит 2, потом 0 за одно исполнение »

Пробуйте так:
Код:

@echo off

>nul find "degraded" file.txt && >nul find "rebuilding" file.txt && (
echo 2
pause
exit /b
)

>nul find "rebuilding" file.txt || >nul find "degraded" file.txt || (
echo 1
pause
)

>nul find "degraded" file.txt && (
echo 0
pause
)


Iska 05-04-2018 18:06 2807246

Цитата:

Цитата zegordo
и в конце ещё status: successful
если не зажимать мышкой »

1. Не зажимайте. Просто откройте командную строку и выполните в ней пакетный файл. Я не вижу смысла добавлять всяческие pause в пакетные файлы.
2. А какой на самом деле сейчас статус?

zegordo 06-04-2018 09:27 2807338

Цитата:

Цитата Казбек
Пробуйте так: »

Спасибо, пока выглядит рабочим, возьму как план Б, если не получится сделать без файлов ввода/вывода


Цитата:

Цитата Iska
Смотрите сами, что там должно быть, «-0» или «-o». »

там o, я неправильно в посте дал, но в вашем коде заметил свою ошибку и её исправлял, поэтому все мои ответы - верны.

Цитата:

Цитата Iska
1. Не зажимайте. Просто откройте командную строку и выполните в ней пакетный файл. Я не вижу смысла добавлять всяческие pause в пакетные файлы.
2. А какой на самом деле сейчас статус?»

без паузы или вывода результат в файл батник быстро отрабатывает, на миг оставляя "status: successful" в своём окне cmd (независимо от состояния рейда)


Вообще CLI этот схож с телнетом, если запускать его из командной строки - т.е. после команды telnet в батнике, команды что были после не сработают. Но думаю, вы это и так поняли уже

Iska 06-04-2018 13:41 2807396

Цитата:

Цитата zegordo
там o, я неправильно в посте дал, но в вашем коде заметил свою ошибку и её исправлял, поэтому все мои ответы - верны. »

Спасибо, ясно.

Цитата:

Цитата zegordo
без паузы или вывода результат в файл батник быстро отрабатывает, на миг оставляя "status: successful" в своём окне cmd »

Я ж говорю — «ручками» откройте окно командной строки и в нём запускайте пакетный файл. Я вообще пользую Far Manager.

Цитата:

Цитата zegordo
Вообще CLI этот схож с телнетом, если запускать его из командной строки - т.е. после команды telnet в батнике, команды что были после не сработают. »

Я бы сказал, что скорее на diskpart.

Тогда пробуем вернуться именно к варианту с echo, только добавив в него ещё и exit, наподобие:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

(
        echo info -o -vd
        echo exit
) | c:\mvsetup.exe | find.exe /i "degraded" && (
        (
                echo info -o -vd
                echo exit
        ) | c:\mvsetup.exe | find.exe /i "rebuilding" && (
                echo Status: Degraded and rebuilding
                exit /b 1
        ) || (
                echo Status: Degraded
                exit /b 2
        )
) || (
        echo Status: Successfull
        exit /b 0
)

endlocal
exit /b 0

Можете даже выложить его (mvsetup.exe) вместе с потребными библиотеками куда-нибудь на обменник «на пощупать», упаковав в архив.

zegordo 06-04-2018 15:00 2807416

Iska, выглядит так, что ничего не изменилось
https://drive.google.com/open?id=1HF...Jevi7OcUWQWY-d - инсталлятор, при установке надо галкой отметить CLI чтобы поставил,
https://support.hpe.com/hpsc/doc/pub...a00022850en_us - гайдик
не знаю, поставится ли если контроллера нет.

апдейт
https://drive.google.com/open?id=1ZS...Brf4E_EZne0A1L вот сама утилита с библиотеками
на другом компе выдаёт по команде info -o -vd "Unable to get info of vd (error 13: Invalid adapter id)" что, в принципе, тот же текст.

megaloman 06-04-2018 15:56 2807425

Цитата:

Цитата zegordo
Есть текстовый файл со следующим содержанием, в котором состояние логического диска рейда. »

Я бы предложил постановку:
1. Если нет ни rebuilding ни degraded, выводить 0 (это нормальное рабочее состояние системы, не нуль = уровень ошибки)
2. Если в тексте есть слово degraded и нет rebuilding, выводить "-1" (именно с минусом)
3. Если есть rebuilding и нет degraded выводить "-10"
4. Если есть rebuilding и degraded выводить "-11"
5. Если есть degraded с процентами, выводить проценты (в данном тексте 23 - тут бы я, вообще-то выводил бы 123, так как есть вероятность индикации 0% -легко подкорректировать)
Наверное, пункт 4 не реализуется никогда, так как его "перебьет" пункт 5.
Вот решение для текстового файла - проверял на Ваших текстах
Код:

@Echo Off
cls

Set "FileIn=Z:\Soft_In\text1.txt"
Set "Word1=degraded"
Set "Word2=rebuilding"

Set /A LWord1=0
find /i "%Word1%" "%FileIn%" >nul &&Set /A LWord1=-1

Set /A LWord2=0
Set "Proc="
FOR /F "usebackq tokens=1,5 delims= " %%r IN (`"find /i "%Word2%" "%FileIn%""`) DO (Set /A LWord2=-10 &Set "Proc=%%s")

If Not "%Proc%"=="" (
        Set /A OutErr=%Proc:~0,-1%
) Else (
        Set /A OutErr=%LWord1%+%LWord2%
)

Echo %OutErr%
pause
Exit /B %OutErr%

Вот попытка решения без текстового файла. Проверялось частично: c:\mvsetup.exe моделировал More.com c файлом, так как иначе протестировать не на чем
Код:

@Echo Off
cls

Set "PRG=c:\mvsetup.exe"
Set "Word1=degraded"
Set "Word2=rebuilding"

Set /A LWord1=0
"%PRG%" |find /i "%Word1%" >nul &&Set /A LWord1=-1

Set /A LWord2=0
Set "Proc="

FOR /F "usebackq tokens=1,5 delims= " %%r IN (`""%PRG%" |find /i "%Word2%" "%FileIn%""`) DO (Set /A LWord2=-10 &Set "Proc=%%s")

If Not "%Proc%"=="" (
        Set /A OutErr=%Proc:~0,-1%
) Else (
        Set /A OutErr=%LWord1%+%LWord2%
)

Echo %OutErr%
pause
Exit /B %OutErr%

Уточните, пожалуйста, как запускается "c:\mvsetup.exe", с какими ключами и параметрами
Значение работы скрипта присваивается переменной и отображается, если Вам это нужно. Скрипт возвращает Errorlevel c этим значением, если понадобится этот скрипт вызывать из другого скрипта.

Iska 06-04-2018 17:32 2807452

Цитата:

Цитата megaloman
2. Если в тексте есть слово degraded и нет rebuilding, выводить "-1" (именно с минусом) »

Ну, вообще-то коды возврата должны описываться целым беззнаковым. -1 — это 0xFFFFFFFF, обычно резервируется для неопознанных ошибок или общих сбоев.


Цитата:

Цитата zegordo
Iska, выглядит так, что ничего не изменилось »

Возвращаясь к:
Цитата:

Цитата zegordo
> -o : invalid object '-vd' »

Там у Вас изначально не только ноль был вместо буквы o, но и ненужный дефис - перед vd. В справке утилиты, которую Вы выложили, описан правильный формат.

Я попробовал и вариант с echo и с командной строкой, и тот, и тот, как и ожидалось, работают. При использовании echo потребно использование exit для выхода из утилиты, при использовании командной строки, понятное дело, сие не требуется.

Вариант с echo
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

(
        echo info -o vd
        echo exit
) | c:\mvsetup.exe | find.exe /i "degraded" && (
        (
                echo info -o vd
                echo exit
        ) | c:\mvsetup.exe | find.exe /i "rebuilding" && (
                echo Status: Degraded and rebuilding
                exit /b 1
        ) || (
                echo Status: Degraded
                exit /b 2
        )
) || (
        echo Status: Successfull
        exit /b 0
)

endlocal
exit /b 0


Вариант с командной строкой
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

c:\mvsetup.exe info -o vd | find.exe /i "degraded" && (
        c:\mvsetup.exe info -o vd | find.exe /i "rebuilding" && (
                echo Status: Degraded and rebuilding
                exit /b 1
        ) || (
                echo Status: Degraded
                exit /b 2
        )
) || (
        echo Status: Successfull
        exit /b 0
)

endlocal
exit /b 0




P.S. И всё же утилита не совсем CLI, поскольку ошибки пишет не как положено — в stderr, а, похоже, напрямую в консоль :).

zegordo 06-04-2018 18:08 2807455

megaloman, я добавил в посте над вами утилиту, можно на ней и потестировать. Минусы же совсем не годятся, т.к. забирать вывод будет zabbix, на минусовом будут проблемы.
Но спасибо за потраченное время.

Iska, выводит не только описанный вами статус, но и дважды само слово, т.е. вывод выглядит так:

status: degraded
status: degraded
(и после небольшой паузы уже ваш текст)
Status: Degraded

p.s. вариант с echo тот что нужен, т.к. запускаться будет именно сам батник.
p.p.s. статус выше выдаёт для массива когда там только состояние degraded, если в тексте есть и degraded и rebuilding будет вывод выглядеть так:

status: degraded
BGA progress: rebuilding is 0% done
Status: Degraded and rebuilding

Iska 06-04-2018 18:33 2807457

Цитата:

Цитата zegordo
Iska, выводит не только описанный вами статус, но и дважды само слово, т.е. вывод выглядит так:
status: degraded
status: degraded
(и после небольшой паузы уже ваш текст)
Status: Degraded »

«Поздравляю, Шарик, ты — балбес!»™. Приношу Вам свои извинения, это я забыл, что вывод-то за find.exe тоже нужно подавлять, он ведь нам не нужен.

Попробуйте так:
Вариант с echo
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

(
        echo info -o vd
        echo exit
) | c:\mvsetup.exe | >nul find.exe /i "degraded" && (
        (
                echo info -o vd
                echo exit
        ) | c:\mvsetup.exe | >nul find.exe /i "rebuilding" && (
                echo Status: Degraded and rebuilding
                exit /b 1
        ) || (
                echo Status: Degraded
                exit /b 2
        )
) || (
        echo Status: Successfull
        exit /b 0
)

endlocal
exit /b 0

Вариант с командной строкой
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

c:\mvsetup.exe info -o vd | >nul find.exe /i "degraded" && (
        c:\mvsetup.exe info -o vd | >nul find.exe /i "rebuilding" && (
                echo Status: Degraded and rebuilding
                exit /b 1
        ) || (
                echo Status: Degraded
                exit /b 2
        )
) || (
        echo Status: Successfull
        exit /b 0
)

endlocal
exit /b 0



Цитата:

Цитата zegordo
p.s. вариант с echo тот что нужен, т.к. запускаться будет именно сам батник. »

Без разницы — и тот вариант, и другой — пакетные файлы.

megaloman 06-04-2018 18:47 2807460

zegordo,
Если Минусы же совсем не годятся, то вот по Вашей постановке (еще проще)
Вариант с текстовым файлом
Код:

@Echo Off
cls

Set "FileIn=Z:\Soft_In\text1.txt"
Set "Word1=degraded"
Set "Word2=rebuilding"

Set /A OutErr=1
find /i "%Word1%" "%FileIn%" >nul &&Set /A OutErr=0

Set "Proc="
FOR /F "usebackq tokens=5 delims= " %%s IN (`"find /i "%Word2%" "%FileIn%""`) DO Set "Proc=%%s"

If Not "%Proc%"=="" Set /A OutErr=%Proc:~0,-1%

Echo %OutErr%
pause
Exit /B %OutErr%

Вариант с утилитой (ключи добавьте сами
Set PRG="c:\mvsetup.exe" тра ля ля )
Код:

@Echo Off
cls

Set PRG="c:\mvsetup.exe"

Set "Word1=degraded"
Set "Word2=rebuilding"

Set /A OutErr=1
%PRG% |find /i "%Word1%" >nul &&Set /A OutErr=0

Set "Proc="
FOR /F "usebackq tokens=5 delims= " %%s IN (`"%PRG% |find /i "%Word2%""`) DO Set "Proc=%%s"

If Not "%Proc%"=="" Set /A OutErr=%Proc:~0,-1%

Echo %OutErr%
pause
Exit /B %OutErr%


zegordo 09-04-2018 09:17 2807839

Извиняюсь за поздний ответ, на выходных не было возможности проверить.
Большое спасибо всем кто откликнулся и, особенно Iska: ваш вариант пойдёт в бой


Время: 06:32.

Время: 06:32.
© OSzone.net 2001-