Компьютерный форум 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=339219)

Alex S 13-02-2019 23:39 2857864

Поиск нескольких строк в файле и запись их в переменную
 
Вложений: 1
Всем привет. Помогите пожалуйста разобраться с поиском информации в wim-файле.
Не хитрыми действиями достал почти всю инфу о содержимом файла, кроме имеющихся языков.
Нужно осуществить поиск всех имеющихся языков в образе при помощи Dism и вывести их список.
Пример поиска для ясности вопроса:
@echo off
cls
:inform
for /f "tokens=* delims=: " %%c in ('Dism.exe /English /Get-WimInfo /WimFile:"C:\install.wim" /Index:1 ^| findstr /i Languages') do (set ImgLanguages=%%c)
echo.
echo Список языков: %ImgLanguages%
pause

Если таким способом искать индекс, имя или другую информацию, то никаких проблем не возникает.
Но с языками дело обстоит иначе. В "findstr" искомое слово "Languages" после себя не содержит никаких данных, все данные (список имеющихся языков) расположены на строках ниже(в столбик).
Вот тут я и споткнулся. Как вывести список языков расположенных ниже "Languages" и записать их в переменную(ые)? Прикреплю скрин отображения информации в Dism.

Vadikan 14-02-2019 01:16 2857870

Alex S, в PowerShell
Код:

(Get-WindowsImage -imagepath "E:\sources\install.wim" -index 1).languages
https://docs.microsoft.com/powershel...?view=win10-ps

Результат
Код:

[PS <4> C:\…\system32] Get-WindowsImage -imagepath "E:\sources\install.wim" -index 1

ImageIndex      : 1
ImageName        : Windows 10 Домашняя
ImageDescription : Windows 10 Домашняя
ImageSize        : 14*337*146*177 bytes
WIMBoot          : False
Architecture    : x64
Hal              :
Version          : 10.0.17763.107
SPBuild          : 107
SPLevel          : 0
EditionId        : Core
InstallationType : Client
ProductType      : WinNT
ProductSuite    : Terminal Server
SystemRoot      : WINDOWS
DirectoryCount  : 20320
FileCount        : 91910
CreatedTime      : 30.10.2018 2:17:06
ModifiedTime    : 30.10.2018 2:46:59
Languages        : ru-RU (Default)

[PS <5> C:\…\system32] (Get-WindowsImage -imagepath "E:\sources\install.wim" -index 1).languages
ru-RU


alpap 14-02-2019 01:40 2857871

За неимением на чем показать - так:
file.txt
Скрытый текст

stroka1 : z1
stroka2 : z2
Languages :
[tab]en-US
[tab]ru-RU (Default)
The operation ...

код
Код:

@echo off
for /f "delims=" %%a in ('findstr /rc:"^        " "file.txt"') do call :# "%%~a"
echo %A:        =%
echo %B:        =%
pause& exit

:#
 set "A=%B%"
 set "B=%~1"
exit /b

вывод:
Скрытый текст

en-US
ru-RU (Default)

Alex S 14-02-2019 10:42 2857882

Пробовал так, результата нет:
Код:

for /f "delims=" %%a in ('DISM /English /Get-WimInfo /WimFile:"C:\install.wim" /Index:1 ^| findstr /rc:"^        "') do call :# "%%~a"
Решил использовать другую программку (ImageX.exe), она в отличие от Dism при выводе информации из wim-файла выдает следующее:
Вывод из Dism.exe
Languages :
en-US
ru-RU (Default)

Вывод из ImageX.exe
<LANGUAGES>
<LANGUAGE>en-US</LANGUAGE>
<LANGUAGE>ru-RU</LANGUAGE>

При использовании такого способа:
Код:

for /f "tokens=2 delims=:<> " %%a in ('Imagex.exe /info "C:\install.wim" 1 ^| findstr /i Language') do call :# "%%~a"
Получаю то что нужно(почти). Выводит список из двух имеющихся языков, но если язык в файле только один, то получаю:
Код:

Обнаруженные языки:
        =
en-US
Для продолжения нажмите любую клавишу

.
Остается вопрос, как убрать лишнее из окна вывода(знак равно), ну и что будет если языков будет больше?

YuS_2 14-02-2019 13:10 2857914

Цитата:

Цитата Alex S
ну и что будет если языков будет больше? »

Чем не подходит вариант на powershell?
Ну, если прям надо именно cmd, то:
Код:

for /f "delims=" %%a in (
    'dism /english /get-imageinfo /imagefile:"d:\install.wim" /index:1 ^|findstr /i "ru-ru en-us en-gb de-de fr-ca zu-za"'
) do echo %%~a

и создавать нумерованные переменные по числу строк...

MS-LCID

Alex S 14-02-2019 14:24 2857940

Цитата:

Цитата YuS_2
Чем не подходит вариант на powershell? »

Не работает у меня PowerShell почему-то. Думал может из-за того что старая версия.
Обновил его и так же не хочет. Такое ощущение что он и не знает команду "Get-WindowsImage", постоянно смс-ка с ошибкой...
Ошибка...
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Windows\System32\WindowsPowerShell\v1.0> Get-WindowsImage -imagepath "C:\W
ork\Image\sources\install.wim" -index 1
Get-WindowsImage : The term 'Get-WindowsImage' is not recognized as the name of
a cmdlet, function, script file, or operable program. Check the spelling of th
e name, or if a path was included, verify that the path is correct and try agai
n.
At line:1 char:1
+ Get-WindowsImage -imagepath "C:\Work\Image\sources\install.wim" -inde ...
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-WindowsImage:String) [], Co
mmandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Vadikan 14-02-2019 15:20 2857954

Alex S, установите WMF 5.1 https://www.microsoft.com/en-us/down....aspx?id=54616

У вас древняя версия пошика

YuS_2 14-02-2019 15:30 2857957

Цитата:

Цитата Alex S
Обновил его и так же не хочет. »

До какой версии?
Код:

$psversiontable
?
Цитата:

Цитата Vadikan
установите WMF 5.1 »

Ну, и на всякий случай, вот версия пакетника с нумерованными переменными:
Код:

@echo off
set "wim=d:\install.wim"

>nul 2>&1 net session||(echo.Запустите батник от имени админа&pause&exit /b)
set /a "i=1"
for /f "delims=" %%a in (
        'dism /english /get-imageinfo /imagefile:"%wim%" /index:1 ^|findstr /i "ru-ru en-us en-gb de-de fr-ca zu-za"'
) do call :# %%~a
set x
pause&exit /b

:#
set "x%i%=%~1"
set /a "i+=1"
exit /b


Alex S 14-02-2019 16:04 2857960

Цитата:

Цитата YuS_2
До какой версии? »

Версия PowerShell

PSVersion 5.1.14409.1005
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.14409.1005

И в ней тоже вылет ошибки...

Цитата:

Цитата YuS_2
Ну, и на всякий случай... »

Спасибо большое!!! Работает.
Только на выходе приписывает "х" к каждому найденному языку. Это нельзя убрать?

На выходе...

Обнаруженные языки:
x1=en-US
x2=ru-RU

Iska 14-02-2019 17:25 2857974

Цитата:

Цитата Alex S
Только на выходе приписывает "х" к каждому найденному языку. Это нельзя убрать? »

Не приписывает. x1/x2/x3…xN — это новосозданные переменные окружения, каждая из которых содержит один из найденных языков. По команде:
Цитата:

Цитата YuS_2
set x »

Вы видите все переменные окружения, начинающиеся на «x», вместе с их значениями. Можете открыть командную строку, набрать в ней, например, «set pro», нажать «Enter» и посмотреть на получившийся результат.

YuS_2 14-02-2019 17:49 2857981

Цитата:

Цитата Alex S
И в ней тоже вылет ошибки... »

Быть не может... ошибка та же? Покажите, плиз.
Что выдает:
Код:

get-command -mod dism
?
Цитата:

Цитата Alex S
Только на выходе приписывает "х" к каждому найденному языку. Это нельзя убрать? »

откуда xN, уже объяснили. Вам же надо было в переменные записать строки, вот и... :)
Вместо set x, можно написать:
Код:

echo [%x1%] - [%x2%] - [%x3%]

Alex S 14-02-2019 18:59 2857993

Цитата:

Цитата YuS_2
Быть не может... ошибка та же? Покажите, плиз. »

Отправил что показывает через лс, чтобы тему не засорять.

Всем спасибо за помощь. Из написанного в теме, выбрал для себя самое подходящее.
Тему считаю решённой.


Время: 17:45.

Время: 17:45.
© OSzone.net 2001-