PDA

Показать полную графическую версию : [решено] Нужна помощь по StringRegExp


nibble74
23-05-2020, 14:10
Нужна помощь по этому коду.

#include <Array.au3>

$iPID = Run("wmic baseboard get Manufacturer", "", @SW_HIDE, $STDOUT_CHILD)
;$iPID = Run("wmic baseboard get Product", "", @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($iPID)
$sOut = StdoutRead($iPID)

;$avArray = StringSplit(StringStripWS('"' & $sOut & '"', 4), @CRLF, 1)
$avArray = StringSplit('"' & $sOut & '"', @CRLF, 1)
_ArrayDisplay($avArray)

$test = StringStripWS($avArray[2], 2) ;2 = удаляет пробельные символы в конце строки

$len = StringLen($test)
MsgBox(0, "Количество символов:", $avArray[2] & $len)

Нужно два варианта:
1. $avArray[2] вся строка.
2. $avArray[2] только первое слово.

Вот со вторым вариантом у меня проблема возникла. Не могу вывести в переменную из $avArray[2] только первое слово.
Может быть использовать метасимволы в StringRegExp, но я не силён в этом.
Или же набросайте какой нибудь другой код скрипта, более подходящий.
Спасибо за внимание.

Iska
23-05-2020, 15:01
Нужна помощь по этому коду. »
По этому — не нужна.

Вы пытаетесь грести вилами вместо весла. Wbem превосходно поддерживает автоматизацию:
AutoItSetOption("MustDeclareVars", 1)

Local $oSWbemLocator
Local $oSWbemServicesEx
Local $oSWbemObjectEx


$oSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")
$oSWbemServicesEx = $oSWbemLocator.ConnectServer(".", "root\cimv2")

For $oSWbemObjectEx In $oSWbemServicesEx.ExecQuery("SELECT Manufacturer FROM Win32_BaseBoard")
ConsoleWrite($oSWbemObjectEx.Manufacturer & @CRLF)
Next

Exit(0)
Далее напишите словами, что Вы хотите получить.

nibble74
23-05-2020, 16:38
Iska, спасибо за оперативный ответ.

Вот полный командный сценарий:
rem Добавление производителя материнской платы
for /F "skip=1 tokens=*" %%a in ('wmic baseboard get Manufacturer') do if not defined Manufacturer set Manufacturer=%%a
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation" /v Manufacturer /t REG_SZ /d "%Manufacturer%" /f
rem Добавление модели материнской платы
for /F "skip=1 tokens=*" %%b in ('wmic baseboard get product') do if not defined product set product=%%b
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation" /v Model /t REG_SZ /d "%product%" /f
set product=
rem Переименование имени компьютера на номер материнской платы
for /F "skip=1 tokens=1" %%b in ('wmic baseboard get product') do if not defined product set product=%%b
wmic computersystem where name="%computername%" call rename name=%product%

С Manufacturer и Product с помощью вашего кода выше всё понятно.

Как быть с этим:
for /F "skip=1 tokens=1" %%b in ('wmic baseboard get product') do if not defined product set product=%%b
wmic computersystem where name="%computername%" call rename name=%product%

Случалось, что некоторые модели материнских плат в "Product" содержит не одно слово. В результате переименование имени компьютера на номер материнской платы будет невозможен, т.к. имя компьютера не должно содержать пробелов.
Хотелось бы из "Product" выбрать первое слово для переименования компьютера.

Iska
23-05-2020, 20:11
nibble74, то есть, мы плавно перешли к пакетным файлам?

Как быть с этим: »
Попробуйте так (не проверялось):
for /F "skip=1 tokens=1 delims=" %%b in ('wmic baseboard get product') do if not defined product set "product=%%b"
if defined product wmic computersystem where name="%computername%" call rename name=%product: =%


Хотелось бы из "Product" выбрать первое слово для переименования компьютера. »
Стоп. Так в приведённом Вами коде первое и должно выбираться. Разве нет?

nibble74
23-05-2020, 23:56
то есть, мы плавно перешли к пакетным файлам? »

Нет нет нет. В моём пакетном файле всё работает так как надо. Просто хотелось реализовать кодами autoit, раз уж решил перенести в Autoit )

Придется наверное прибегнуть к простому варианту
RunWait(@ComSpec & ' /c ........', '', @SW_HIDE)

Паразит
24-05-2020, 12:17
nibble74, покажите, что в $sOut.

Creat0R
24-05-2020, 12:26
Так дали же пример, просто возьми первое слово:

$oSWbemLocator = ObjCreate (http://www.autoitscript.com/autoit3/docs/functions/ObjCreate.htm)("WbemScripting.SWbemLocator")
$oSWbemServicesEx = $oSWbemLocator.ConnectServer(".", "root\cimv2")

$sManufacturer = ''

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $oSWbemObjectEx In (http://www.autoitscript.com/autoit3/docs/keywords.htm#In) $oSWbemServicesEx.ExecQuery("SELECT Manufacturer FROM Win32_BaseBoard")
$sManufacturer = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($oSWbemObjectEx.Manufacturer, '^([^\h]+).*', '\1')
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)($sManufacturer & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@CRLF))

Ну или так:

#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <Array.au3>

$iPID = Run (http://www.autoitscript.com/autoit3/docs/functions/Run.htm)(@ComSpec (http://www.autoitscript.com/autoit3/docs/macros.htm#@ComSpec) & " /C wmic baseboard get Manufacturer", "", @SW_HIDE (http://www.autoitscript.com/autoit3/docs/macros.htm#@SW_HIDE), $STDOUT_CHILD)
ProcessWaitClose (http://www.autoitscript.com/autoit3/docs/functions/ProcessWaitClose.htm)($iPID)
$sOut = StdoutRead (http://www.autoitscript.com/autoit3/docs/functions/StdoutRead.htm)($iPID)

$avArray = StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($sOut, '([^\s]+)', 3)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
_ArrayDisplay (http://www.autoitscript.com/autoit3/docs/libfunctions/_ArrayDisplay.htm)($avArray)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(0, '', $avArray[1] & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@CRLF) & "Количество символов: " & StringLen (http://www.autoitscript.com/autoit3/docs/functions/StringLen.htm)($avArray[1]))
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

nibble74
24-05-2020, 13:16
Creat0R, То что надо было. У меня путаница происходила с StringRegExp )

Всем спасибо за отклик и помощь !




© OSzone.net 2001-2012