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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Найти строку и в ней записать в переменную содержимое между кавычек. (http://forum.oszone.net/showthread.php?t=334118)

rango13 03-04-2018 13:27 2806774

Найти строку и в ней записать в переменную содержимое между кавычек.
 
Всем привет!

Необходимо пройтись поиском по каждой строке во всём файле, найти определенную строку(несколько слов вхождений) и в этой найденной строке записать в переменную слова, находящиеся между кавычек.

Как пример, ищем в файле ниже строку "Serial Number", затем в ней извлекаем значение "11325":

Код:

....
Motherboard "ASUS"
....
Product Name "B150M-A"
Serial Number of motherboard "11325"



Upd. bat-файл будет грузиться только с FreeDOS.

x0r 03-04-2018 13:38 2806781

поиск и замена

rango13 03-04-2018 13:52 2806783

Цитата:

Цитата x0r
поиск и замена »

Может быть, просто плохо искал, но посмотрев по поиску 4 страницы в этом разделе, не нашёл решения. Много предложений, где необходимо вывести в переменную уже известный набор символов, а не найти строку и затем в ней занести в переменную заранее неизвестное содержимое, расположенное между кавычек.
И нужно именно bat-файлом сделать, т.к. скрипт этот будет грузиться из FreeDOS.

megaloman 03-04-2018 15:21 2806798

rango13,
Вот вариант
Код:

@Echo Off
cls

Call :Quote "Z:\Box_In\тра ля ля.txt" "Serial Number" "Rezult"
Echo [%Rezult%]    ErrorLevel=%ErrorLevel%

pause
GoTo :Eof

:Quote
        Set "%~3="
        For /F "usebackq tokens=2 delims=:" %%a In (`2^>nul FINDSTR /B /I /N /C:%2 %1`) DO (Call :OutQuote "%%a" %3 &Exit /B 0)
        Exit /B 1
        :OutQuote
                Set "OutRez=%~1"
                Call :OutRez0 "%OutRez:*"=% %2
        GoTo :Eof
        :OutRez0
                Set "%~2=%~1"
GoTo :Eof


Iska 03-04-2018 17:41 2806830

megaloman, боюсь, во:
Цитата:

Цитата rango13
FreeDOS »

такое не будет работать.

rango13 04-04-2018 05:20 2806905

Цитата:

Цитата Iska
такое не будет работать. »

Да, действительно, результат работы скрипта:
Код:

Bad command or filename - ":Quote".
[]    ErrorLevel=0


Iska 04-04-2018 13:49 2806980

rango13, во FreeDOS команда call может использоваться только для вызова внешних пакетных файлов, возможность вызова внутренних процедур (aka «Call :Quote …») отсутствует. Нет там и goto :eof, нет exit /b, нет и разбора по for /f.

rango13 05-04-2018 06:04 2807099

Цитата:

Цитата Iska
во FreeDOS команда call может использоваться только для вызова внешних пакетных файлов, возможность вызова внутренних процедур (aka «Call :Quote …») отсутствует. Нет там и goto :eof, нет exit /b, нет и разбора по for /f. »

Может быть, есть аналог FreeDOS, чтобы текущий скрипт работал?
Утилита, которая предоставляет информацию по материнской плате, работает только из DOS. Т.е. установил на usb-флешку FreeDOS, запустил утилиту, отображающую необходимую информацию и из её вывода вытащил определенные значения, которые затем этой же утилитой и изменил.

Вот пример её вывода

Initializing the SMBIOS interface. Please wait a moment......
Name R/W Status Information

--------------------------- --- ------ ----------------------------------

(/IV)BIOS version R Done "2501"

(/ID)BIOS release date R Done "07/22/2015"
(/SM)System manufacture R Done "ASUS"
(/SP)System product R Done "B85M-G"
(/SV)System version R Done "System Version"
(/SS)System Serial number R Done "sernum-791"
(/SU)System UUID R Done "60112E33DAD7DD1193FA10C37B9408E0h"
(/SK)System SKU number R Done "All"
(/SF)System Family R Done "ASUS"
(/BM)Baseboard manufacture R Done "ASUSTeK COMPUTER INC."
(/BP)Baseboard product R Done "B85M-G"
(/BV)Baseboard version R Done "Rev X.0x"
(/BS)Baseboard Serial number R Done "140525894105007"
(/BT)Baseboard Asset Tag R Done "To be filled by O.E.M."
(/BLC)BB. Loc. in Chassis R Done "To be filled by O.E.M." BaseBoardHandle = "0002h"
(/BMH)Baseboard manufacture R Done "ASUSTeK COMPUTER INC."
(/BPH)Baseboard product R Done "B85M-G"
(/BVH)Baseboard version R Done "Rev X.0x"
(/BSH)Baseboard Serial number R Done "140525894105007"
(/BTH)Baseboard Asset Tag R Done "To be filled by O.E.M."
-- More --
(/BLCH)BB. Loc. in Chassis R Done "To be filled by O.E.M."
(/CM)Chassis manufacture R Done "Chassis Manufacture"
(/CT)Chassis type R Done "03h"
(/CV)Chassis version R Done "Chassis Version"
(/CS)Chassis Serial number R Done "Chassis Serial Number"
(/CA)Chassis Tag number R Done "Asset-1234567890"
(/CO)Chassis OEM value R Done "00000000h"
(/CSK)Chassis SKU Number R Done "To be filled by O.E.M."
(/OS)OEM string #1 R Done "To Be Filled By O.E.M."
(/OS)OEM string #2 R Done "To Be Filled By O.E.M."
(/OS)OEM string #3 R Done "AB85"
(/OS)OEM string #4 R Done "To Be Filled By O.E.M."
(/SCO)System Conf. Op. #1 R Done "To Be Filled By O.E.M."

(/PBH)PortBat Handle R Invalid
(/PBL)PortBat Location R Invalid
(/PBM)PortBat Manufacturer R Invalid
(/PBD)PortBat Manu. Date R Invalid
(/PBS)PortBat Serial Num R Invalid
(/PBN)PortBat Device Name R Invalid
(/PBCH)PortBat Device Chem. R Invalid
(/PBCA)PortBat Design Cap. R Invalid
(/PBV)PortBat Design Volt. R Invalid
(/PBSV)PortBat SBDS Ver.Num. R Invalid
(/PBE)PortBat Maxmum Error R Invalid
(/PBSN)PortBat SBDS Serial Num.R Invalid
(/PBSD)PortBat SBDS Manu. Date R Invalid
(/PBSC)PortBat SBDS Dev. Chem. R Invalid

Сейчас приходится вручную запускать три команды с ключами: (/SM), (/SP), (/SS). В первые две записываются значения из выделенных жирным строк, а последнее - тот номер, который дала бухгалтерия.

alpap 05-04-2018 10:04 2807116

может Phoenix BIOS Setup ?

Iska 05-04-2018 13:45 2807174

Цитата:

Цитата rango13
Может быть, есть… »

Я не знаю, что за утилита, равно как и то, что именно Вам требуется, и зачем. Как по мне, так для вывода вполне достаточно:
Код:

wmic.exe BaseBoard get Manufacturer, Product, SerialNumber /value

megaloman 05-04-2018 14:07 2807181

Iska, Каюсь, поставил на флэшку MS Dos 8. Там возможности CMD очень ограничены. FreeDos похоже не радостнее. ИМХО, решить поставленную задачу, только используя команды CMD, вряд ли возможно. Я не понимаю суперцель поставленной задачи, но, если надо загрузиться с флэшки и что-то отобразить из файла, возможное решение - наваять exe-файл на каком-нибудь забытом турбо-си/паскале/бейсике. Вот если бы можно было перенести CMD из Windows, например, 7 на флэшку со всеми основными утилитами. Пока не нашел как.

rango13 05-04-2018 20:26 2807264

Цитата:

Цитата alpap
может Phoenix BIOS Setup ? »

Нет. Она современные матплаты не поддерживает.

Цитата:

Цитата Iska
Как по мне, так для вывода вполне достаточно »

wmic из под DOS не запуститься, очевидно. Получается, под FreeDOS нет способа решения задачи?

alpap 05-04-2018 21:17 2807278

тут можно провести аналогию по работе до загрузки в систему, что мы обычно используем - Total Commander. Брать его в пару и крутить его рычаги, больше ничего в голову не идет.

Iska 06-04-2018 01:38 2807314

Цитата:

Цитата rango13
wmic из под DOS не запуститься, очевидно. »

Само собой. Я писал про то, что для получения указанных сведений достаточно wmic.exe, и никакой FreeDOS не нужен.

Цитата:

Цитата rango13
Получается, под FreeDOS нет способа решения задачи? »

Есть же:
Цитата:

Цитата megaloman
наваять exe-файл на каком-нибудь забытом турбо-си/паскале/бейсике. »

Причём, необязательно на забытом и древнем.

Если б Вы объяснили общую задачу, в том числе — зачем (почему/для чего/с какой целью) нужно сие проделывать именно то, что описано, и именно из-под DOS, может быть, стало бы понятнее.

rango13 08-04-2018 05:43 2807693

Вложений: 2
Цитата:

Цитата Iska
Если б Вы объяснили общую задачу, в том числе — зачем (почему/для чего/с какой целью) нужно сие проделывать именно то, что описано, и именно из-под DOS, может быть, стало бы понятнее. »

Есть бесплатная система учёта техники - Spiceworks. Она через wmic собирает информацию по имеющимся машинам(на которых установлено клиентское ПО-сборщик) и в веб-интерфейсе оной каждый ПК виден как отдельная карточка с данными о нём. В этой карточке пишется вся история физических изменений в ПК(замена ОЗУ/матплаты/HDD). Если производится апгрейд на новую связку(mb+cpu+mem), то при опросе этой новой связки Spiceworks решит, что это новое устройство и создаст дублирующую карточку. Если же до установки клиентской части Spiceworks прописать через утилиту(работающую только в DOS) такой же серийный номер, как и на старой матплате - карточки нового и старого устройства объединятся и в ней сохраниться вся история модернизации. Это к вопросу зачем.

Теперь зачем ещё прописывать значения Motherboard и Product Number: почему-то в матплатах от ASUS(которые у нас только и закупаются) эти значения пустуют - а через утилиту(AmideDOS.exe) эти значения можно прописать в BIOS и их как раз и вытащит клиент-сборщик Spiceworks.

Проблема в том, что есть много ПК, где эти параметры не прописаны. В bat-файле я хотел передавать ему только Serial Number, а остальные два значения чтобы прописывались автоматом.

В итоге все эти данные с помощью отчёта из Spiceworks автоматом собираются в единую таблицу Excel, по которой видно, что нужно модернизировать в новом году.

rango13 10-04-2018 05:45 2808021

Может быть, можно пользоваться не FreeDOS, а чем-то ещё подобным, чтобы скрипт работал полноценно?

Iska 10-04-2018 07:30 2808026

rango13, дык, не факт, что Ваша утилита заработает под «чем-то ещё подобным» (коим является только Windows с WinAPI). Выход подсказали выше:
Цитата:

Цитата megaloman
возможное решение - наваять exe-файл на каком-нибудь забытом турбо-си/паскале/бейсике. »

хоть банальнейший QB 4.5 :). Приложение должно брать Вашу утилиту, исполнять её с потребными параметрами, получать её stdout, читать оттуда, фильтровать, затем по результатам фильтрации исполнять ещё раз с другими параметрами. Я так вижу.

rango13 11-04-2018 12:07 2808266

Цитата:

Цитата Iska
хоть банальнейший QB 4.5 . Приложение должно брать Вашу утилиту, исполнять её с потребными параметрами, получать её stdout, читать оттуда, фильтровать, затем по результатам фильтрации исполнять ещё раз с другими параметрами. Я так вижу. »

К сожалению, на это времени нет. Решил полуавтоматизацией процесса.
1. Скачал FreeDOS USB “Full” installer
2. Вытащил с него программу GREP и скопировал её на имеющуюся USB-флешку с FreeDOS и использовал GREP для нахождения необходимых строк. Не знаю почему, но команды FIND/FINDSTR("Invalid command") в этом дистрибутиве нет.
3. Т.к. матплаты только от ASUS в организации, то остается прописать два параметра: модель матплаты и серийный номер, чего скрипт и делает:
Скрытый текст

@ECHO OFF
amidedos /BM | GREP "(/BM)"
amidedos /BP | GREP "(/BP)"
amidedos /SS | GREP "(/SS)"

set /p MODEL=Enter MotherBoard Model:
set /p INV=Enter Inventory Number:

amidedos /SM "ASUS" > null 2>&1
amidedos /BM "ASUS" > null 2>&1
amidedos /BMH "ASUS" > null 2>&1
amidedos /SP "%MODEL%" > null 2>&1
amidedos /BP "%MODEL%"> null 2>&1
amidedos /BPH "%MODEL%" > null 2>&1
amidedos /SS "%INV%" > null 2>&1
amidedos /CS "%INV%" > null 2>&1
cls
; Вывод итогового результата работы скрипта
amidedos /BM | GREP "(/BM)"
amidedos /BP | GREP "(/BP)"
amidedos /SS | GREP "(/SS)"

Iska 12-04-2018 01:12 2808363

rango13, Вы что-то путаете с:
Цитата:

Цитата rango13
Не знаю почему, но команды FIND/FINDSTR("Invalid command") в этом дистрибутиве нет. »

поскольку find там есть, токмо не в формате exe, а в формате com:
Скрытый текст

rango13 12-04-2018 05:28 2808370

Цитата:

Цитата Iska
поскольку find там есть, токмо не в формате exe, а в формате com: »

Странно, ну ладно.
Если что, для накатывания FreeDOS на USB-флешку использовал программу Rufus. У неё при форматировании флешки можно сразу сделать её загрузочной и записать на неё FreeDOS. Может, просто урезанная версия там.

Iska 12-04-2018 06:29 2808372

Цитата:

Цитата rango13
Странно, ну ладно.
Если что, для накатывания FreeDOS на USB-флешку использовал программу Rufus. »

Странно. Хотя это не установленная и развёрнутая FreeDOS, а инсталляционный комплект, но там тоже есть неупакованный FIND.COM.

megaloman 12-04-2018 19:03 2808564

rango13,
прохожусь поиском по каждой строке во всём файле, найти определенную строку(несколько слов вхождений) и в этой найденной строке выделяю слова, находящиеся между кавычек. Как записать в переменную - не знаю
Использовал батник, который генерит программу для старого QBasic 1.1 - думаю, сможете его разыскать без проблем. Подозреваю, проще полностью написать Вашу задачу на базике и не уродоваться с батником
Тестировал в MS DOS 8. Кстати, ставил на флэшку посредством Rufus
Код:

@Echo Off
cls

Set FileIn=TEST.TXT
Set FindStr=Serial Number
Set BasTmp=bastmp.bas

Echo DIM StrIn AS STRING >%BasTmp%
Echo DIM Finds AS STRING >>%BasTmp%
Echo DIM A AS STRING >>%BasTmp%
Echo. >>%BasTmp%
Echo DIM i AS INTEGER >>%BasTmp%
Echo DIM j1 AS INTEGER >>%BasTmp%
Echo DIM j2 AS INTEGER >>%BasTmp%
Echo. >>%BasTmp%
Echo Finds = "%FindStr%" >>%BasTmp%
Echo. >>%BasTmp%
Echo OPEN "%FileIn%" FOR INPUT AS #1 >>%BasTmp%
Echo. >>%BasTmp%
Echo WHILE NOT EOF(1) >>%BasTmp%
Echo        INPUT #1, StrIn >>%BasTmp%
Echo        i = INSTR(1, UCASE$(StrIn), UCASE$(Finds)) >>%BasTmp%
Echo        IF NOT i = 0 THEN >>%BasTmp%
Echo '                PRINT StrIn >>%BasTmp%
Echo                j1 = INSTR(1, StrIn, CHR$(34)) + 1 >>%BasTmp%
Echo                j2 = INSTR(j1, StrIn, CHR$(34)) >>%BasTmp%
Echo                PRINT MID$(StrIn, j1, j2 - j1) >>%BasTmp%
Echo        END IF >>%BasTmp%
Echo WEND >>%BasTmp%
Echo CLOSE #1 >>%BasTmp%
Echo SYSTEM >>%BasTmp%

QBASIC.EXE /RUN %BasTmp%

Pause


Iska 13-04-2018 00:33 2808592

Цитата:

Цитата megaloman
который генерит программу для старого QBasic 1.1 - думаю, сможете его разыскать без проблем. Подозреваю, проще полностью написать Вашу задачу на базике и не уродоваться с батником »

Там и искать ничего не надо: в комплекте поставки идут пара basic'ов, fpc, куча компиляторов C/Objective C/C++ (включая известный проект DGGPP), несколько ассемблеров, PERL, REXX, Lua — в общем, ешь-не хочу, было бы желание.


Время: 09:59.

Время: 09:59.
© OSzone.net 2001-