Показать полную графическую версию : [решено] Поиск по тексту в 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
2. Если есть rebuilding, выводить цифры без % из этой строки, в данном тексте вывод должен быть "23"
3. Если нет ни degraded, ни rebuilding, выводить "1"
При 1% неоднозначно получается (да и при 0% тоже).
Чёрт, а ведь вы правы.
Тогда лучше сделать возврат "2" во втором пункте, независимо от числа в строке. Т.е. если rebuilding есть - 2.
Если есть rebuilding, выводить цифры без % из этой строки, в данном тексте вывод должен быть "23" »
А degraded при этом есть или нет?
zegordo, а что Вам та же wmic.exe/WMI CIM Studio говорит в этот момент насчёт состояния массива (подходящие классы Вам самому поискать придётся)?
Есть текстовый файл »
Как/откуда он берётся? Может, лучше будет зараз разбирать вывод утилиты напрямую (если сие возможно, конечно)?
А 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 говорит в этот момент насчёт состояния массива »
А никак, рейд хардварный, винда видит массив всегда стабильно работающим и не имеет доступа к дискам в нём
так хватит?
@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
т.е. примерно так… »
Попробуйте выполнить в консоли:
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.
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
)
так хватит? »
а зачем занулять? даже без этого, результат не даёт.
Будет вывод текста на консоль? »
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 за одно исполнение
FIND: Invalid switch написал только. »
Что-то Вы не то скопировали, видимо.
важно отметить, это hyper-v server 2016, возможно не хватает каких-то компонентов. »
Э… Это банальная командная строка, внешняя утилита, родная.
Что говорит:
find.exe /?
?
Что говорит: »
всё верно, как-то не так скопировал
теперь говорит
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
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».
то выглядит так
https://i.imgur.com/o8VNI6b.jpg
и в конце ещё status: successful
если не зажимать мышкой
Казбек, ваш вариант рабочий, только если есть и 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
)
и в конце ещё status: successful
если не зажимать мышкой »
1. Не зажимайте. Просто откройте командную строку и выполните в ней пакетный файл. Я не вижу смысла добавлять всяческие pause в пакетные файлы.
2. А какой на самом деле сейчас статус?
Пробуйте так: »
Спасибо, пока выглядит рабочим, возьму как план Б, если не получится сделать без файлов ввода/вывода
Смотрите сами, что там должно быть, «-0» или «-o». »
там o, я неправильно в посте дал, но в вашем коде заметил свою ошибку и её исправлял, поэтому все мои ответы - верны.
1. Не зажимайте. Просто откройте командную строку и выполните в ней пакетный файл. Я не вижу смысла добавлять всяческие pause в пакетные файлы.
2. А какой на самом деле сейчас статус?»
без паузы или вывода результат в файл батник быстро отрабатывает, на миг оставляя "status: successful" в своём окне cmd (независимо от состояния рейда)
Вообще CLI этот схож с телнетом, если запускать его из командной строки - т.е. после команды telnet в батнике, команды что были после не сработают. Но думаю, вы это и так поняли уже
там 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) вместе с потребными библиотеками куда-нибудь на обменник «на пощупать», упаковав в архив.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.