Войти

Показать полную графическую версию : Найти строку и в ней записать в переменную содержимое между кавычек.


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

rango13
03-04-2018, 13:27
Всем привет!

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



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



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

x0r
03-04-2018, 13:38
поиск и замена (https://www.google.com/search?as_q=поиск и замена&as_sitesearch=forum.oszone.net)

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

megaloman
03-04-2018, 15:21
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
megaloman, боюсь, во:
FreeDOS »
такое не будет работать.

rango13
04-04-2018, 05:20
такое не будет работать. »
Да, действительно, результат работы скрипта:

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

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

rango13
05-04-2018, 06:04
во 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
может Phoenix BIOS Setup ?

Iska
05-04-2018, 13:45
Может быть, есть… »
Я не знаю, что за утилита, равно как и то, что именно Вам требуется, и зачем. Как по мне, так для вывода вполне достаточно:
wmic.exe BaseBoard get Manufacturer, Product, SerialNumber /value

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

rango13
05-04-2018, 20:26
может Phoenix BIOS Setup ? »
Нет. Она современные матплаты не поддерживает.

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

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

Iska
06-04-2018, 01:38
wmic из под DOS не запуститься, очевидно. »
Само собой. Я писал про то, что для получения указанных сведений достаточно wmic.exe, и никакой FreeDOS не нужен.

Получается, под FreeDOS нет способа решения задачи? »
Есть же:
наваять exe-файл на каком-нибудь забытом турбо-си/паскале/бейсике. »
Причём, необязательно на забытом и древнем.

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

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

Теперь зачем ещё прописывать значения Motherboard и Product Number: почему-то в матплатах от ASUS(которые у нас только и закупаются) эти значения пустуют - а через утилиту(AmideDOS.exe (https://webcache.googleusercontent.com/search?q=cache:_KvLKPy-uD8J:https://support.siliconmechanics.com/portal/kb/articles/dmi-fru-imprinting-with-amidedos-exe+&cd=1&hl=ru&ct=clnk&gl=ru)) эти значения можно прописать в BIOS и их как раз и вытащит клиент-сборщик Spiceworks.

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

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

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

Iska
10-04-2018, 07:30
rango13, дык, не факт, что Ваша утилита заработает под «чем-то ещё подобным» (коим является только Windows с WinAPI). Выход подсказали выше:
возможное решение - наваять exe-файл на каком-нибудь забытом турбо-си/паскале/бейсике. »
хоть банальнейший QB 4.5 :). Приложение должно брать Вашу утилиту, исполнять её с потребными параметрами, получать её stdout, читать оттуда, фильтровать, затем по результатам фильтрации исполнять ещё раз с другими параметрами. Я так вижу.

rango13
11-04-2018, 12:07
хоть банальнейший QB 4.5 . Приложение должно брать Вашу утилиту, исполнять её с потребными параметрами, получать её stdout, читать оттуда, фильтровать, затем по результатам фильтрации исполнять ещё раз с другими параметрами. Я так вижу. »
К сожалению, на это времени нет. Решил полуавтоматизацией процесса.
1. Скачал FreeDOS USB “Full” installer (http://www.freedos.org/download/)
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
rango13, Вы что-то путаете с:
Не знаю почему, но команды FIND/FINDSTR("Invalid command") в этом дистрибутиве нет. »
поскольку find там есть, токмо не в формате exe, а в формате com:
https://i.imgur.com/mtwoubt.png

rango13
12-04-2018, 05:28
поскольку find там есть, токмо не в формате exe, а в формате com: »
Странно, ну ладно.
Если что, для накатывания FreeDOS на USB-флешку использовал программу Rufus. У неё при форматировании флешки можно сразу сделать её загрузочной и записать на неё FreeDOS. Может, просто урезанная версия там.




© OSzone.net 2001-2012