Войти

Показать полную графическую версию : [решено] Поиск по тексту в txt с "если"


Страниц : [1] 2

zegordo
05-04-2018, 11:24
Добрый день!

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

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
2. Если есть rebuilding, выводить цифры без % из этой строки, в данном тексте вывод должен быть "23"
3. Если нет ни degraded, ни rebuilding, выводить "1"
При 1% неоднозначно получается (да и при 0% тоже).

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

Казбек
05-04-2018, 13:56
Если есть rebuilding, выводить цифры без % из этой строки, в данном тексте вывод должен быть "23" »

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

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

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

zegordo
05-04-2018, 14:42
А degraded при этом есть или нет? »
есть, пример как раз под спойлером

Как/откуда он берётся? Может, лучше будет зараз разбирать вывод утилиты напрямую (если сие возможно, конечно)? »
с рейд-контроллером можно общаться через CLI
https://i.imgur.com/g8Kl7Wn.jpg

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

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

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

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


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

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

alpap
05-04-2018, 15:18
так хватит?

@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
т.е. примерно так… »
Попробуйте выполнить в консоли:
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
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
так хватит? »
а зачем занулять? даже без этого, результат не даёт.

Будет вывод текста на консоль? »
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
FIND: Invalid switch написал только. »
Что-то Вы не то скопировали, видимо.

важно отметить, это hyper-v server 2016, возможно не хватает каких-то компонентов. »
Э… Это банальная командная строка, внешняя утилита, родная.

Что говорит:
find.exe /?
?

zegordo
05-04-2018, 17:16
Что говорит: »
всё верно, как-то не так скопировал

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

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
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
?

> -o : invalid object '-vd' > info: option -o is required »
Я брал отсюда:
Текст в первом посте выдаётся командой "info -o -vd" »
Смотрите сами, что там должно быть, «-0» или «-o».

zegordo
05-04-2018, 17:53
то выглядит так

https://i.imgur.com/o8VNI6b.jpg

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

Казбек
05-04-2018, 17:58
Казбек, ваш вариант рабочий, только если есть и 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
и в конце ещё status: successful
если не зажимать мышкой »
1. Не зажимайте. Просто откройте командную строку и выполните в ней пакетный файл. Я не вижу смысла добавлять всяческие pause в пакетные файлы.
2. А какой на самом деле сейчас статус?

zegordo
06-04-2018, 09:27
Пробуйте так: »
Спасибо, пока выглядит рабочим, возьму как план Б, если не получится сделать без файлов ввода/вывода


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

1. Не зажимайте. Просто откройте командную строку и выполните в ней пакетный файл. Я не вижу смысла добавлять всяческие pause в пакетные файлы.
2. А какой на самом деле сейчас статус?»
без паузы или вывода результат в файл батник быстро отрабатывает, на миг оставляя "status: successful" в своём окне cmd (независимо от состояния рейда)


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

Iska
06-04-2018, 13:41
там o, я неправильно в посте дал, но в вашем коде заметил свою ошибку и её исправлял, поэтому все мои ответы - верны. »
Спасибо, ясно.

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

Вообще 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
Iska, выглядит так, что ничего не изменилось
https://drive.google.com/open?id=1HF5ZEKt1EOvJGn6QmsJevi7OcUWQWY-d - инсталлятор, при установке надо галкой отметить CLI чтобы поставил,
https://support.hpe.com/hpsc/doc/public/display?docId=a00022850en_us - гайдик
не знаю, поставится ли если контроллера нет.

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

megaloman
06-04-2018, 15:56
Есть текстовый файл со следующим содержанием, в котором состояние логического диска рейда. »Я бы предложил постановку:
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%@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 этим значением, если понадобится этот скрипт вызывать из другого скрипта.




© OSzone.net 2001-2012